CF1110D Jongmah

经典题。

\(\tt{Link}\)

题意

你手中有 $$\(n\)$$ 张牌。每张牌上都写着一个介于 \(1\)\(m\) 之间的整数。要赢得游戏,需要组成一定数量的三元组。每个三元组由三张牌组成,这样写在牌上的数字要么全部相同,要么连续。例如, \(7, 7, 7\)\(12, 13, 14\) 都是有效的三连牌,但 \(2,2,3\)\(2,4,6\) 则不是。你只能用手中的牌组成三元组。每张牌最多只能组成一个三元组。
为了确定你离胜利有多近,您需要知道你手中的牌最多可以组成多少个三元组。

\(\tt{Solution}\)

注意到,对于 \(i\) 这张牌(牌上数字为 \(i\)),它选择 \((i,i + 1,i + 2)\)\((i,i,i)\) 的数量是受 \(i - 1,i - 2\) 影响的,所以我们首先会有一个暴力 DP:\(f_{i,j,k}\) 表示当前选择到第 \(i\) 种牌,\(i\) 选择了 \(j\)\((i,i + 1,i + 2)\)\(i - 1\) 选择了 \(k\)\((i - 1,i,i + 1)\)

转移显然为 \(f_{i,j,k} = \max\limits_{l = 0}^{cnt_{i - 2}} f_{i - 1,k,l} + \frac{cnt_i - j - k - l}{3} + j\)
其中 \(cnt_i\) 表示牌上数字为 \(i\) 的牌的张数。

注意到这样做的时间复杂度是 \(\mathcal{O(nm^3)}\),完全不能通过。

有一个很好的性质是如果我们组成了 \(c(c \ge 3)\) 个形如 \((i,i + 1,i + 2)\) 的三元组,可以将其转换为 \(\lfloor \frac{c}{3} \rfloor\) 个形如 \((i,i,i)\) 的三元组,这么做一定不劣。
那么对于上面转移中的 \(j,k,l\),只需要枚举 \([0,2]\) 即可。

然后就做完了。时间复杂度 \(\mathcal{O(3^3n)}\)

#include <bits/stdc++.h>// #define int long long
#define ll long long
#define ull unsigned long long
#define db double
#define ld long double
#define rep(i,l,r) for (int i = (int)(l); i <= (int)(r); ++ i )
#define rep1(i,l,r) for (int i = (int)(l); i >= (int)(r); -- i )
#define il inline
#define fst first
#define snd second
#define ptc putchar
#define Yes ptc('Y'),ptc('e'),ptc('s'),puts("")
#define No ptc('N'),ptc('o'),puts("")
#define YES ptc('Y'),ptc('E'),ptc('S'),puts("")
#define NO ptc('N'),ptc('O'),puts("")
#define vi vector<int>
#define pb emplace_back
#define sz(x) (int)(x.size())
#define all(x) x.begin(),x.end()
#define me(a,x) memset(a,x,sizeof a)
#define get(x) ((x - 1) / len + 1)
#define debug() puts("------------")using namespace std;
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
typedef pair<ll,ll> PLL;
namespace szhqwq {template<class T> il void read(T &x) {x = 0; T f = 1; char ch = getchar();while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); }x *= f;}template<class T,class... Args> il void read(T &x,Args &...x_) { read(x); read(x_...); }template<class T> il void print(T x) {if (x < 0) ptc('-'), x = -x; if (x > 9) print(x / 10); ptc(x % 10 + '0');}template<class T,class T_> il void write(T x,T_ ch) { print(x); ptc(ch); }template<class T,class T_> il void chmax(T &x,T_ y) { x = x < (T)y ? (T)y : x; }template<class T,class T_> il void chmin(T &x,T_ y) { x = x > (T)y ? (T)y : x; }template<class T,class T_,class T__> il T qmi(T a,T_ b,T__ p) {T res = 1; while (b) {if (b & 1) res = res * a % p;a = a * a % p; b >>= 1;} return res;}template<class T> il T gcd(T a,T b) { if (!b) return a; return gcd(b,a % b); }template<class T,class T_> il void exgcd(T a, T b, T_ &x, T_ &y) {if (b == 0) { x = 1; y = 0; return; }exgcd(b,a % b,y,x); y -= a / b * x; return ;}template<class T,class T_> il T getinv(T x,T_ p) { T inv,y; exgcd(x,(T)p,inv,y);inv = (inv + p) % p; return inv;}
} using namespace szhqwq;
const int N = 1e6 + 10,inf = 1e9,mod = 998244353;
const ull base = 131,base_ = 233;
const ll inff = 1e18;
const db eps = 1e-6;
int n,m,a[N],cnt[N],f[N][3][3];il void solve() {//------------code------------read(n,m); rep(i,1,n) read(a[i]),++ cnt[a[i]];rep(i,1,m) rep(j,0,2) rep(k,0,2) rep(l,0,2) if (cnt[i] >= j + k + l && cnt[i - 1] >= k + l && (i == 1 || cnt[i - 2] >= l))chmax(f[i][j][k],f[i - 1][k][l] + (cnt[i] - j - k - l) / 3 + j);int ret = f[m][0][0];write(ret,'\n');return ;
}il void init() {return ;
}signed main() {// init();int _ = 1;// read(_);while (_ -- ) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/862488.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 使用脚手架

一、安装脚手架npm install -g @vue/cli注意:安装过程有警告,安装完后,关闭窗口,重新打开cmd,输入vue,没有报错 二、切换到创建文件的目录,然后使用命令创建vue create vue_test耐心等待 三、启动项目npm run serve

DL00237-基于YOLOv8深度学习的磁瓦缺陷检测含完整数据集实验结果

https://item.taobao.com/item.htm?ft=t&id=787390961923&spm=a21dvs.23580594.0.0.621e2c1bY0k4d9

中考英语优秀范文-005 What will you do for Mum? 你将为妈妈做些什么?

1 写作要求 天下最伟大的爱就是母爱。假设你是李静,母亲节就要到了,你们班将举办以What will you do for Mum? 为题的英语演讲比赛。请你准备一篇80词左右的演讲稿参加比赛。 2 优秀范文 What will you do for Mum? Hello, class. I’m Li Jing. Mother’s Day is coming. …

Notes.js的安装和配置

一、安装 1、下载 https://nodejs.org/en/download/ 2、安装 3、测试 打开cmd 查看node 和npm 版本node -vnpm -v 二、环境配置 1、找到安装目录,新建 node_cache 和 node_global文件夹 2、以管理员权限打开cmd 输入npm config set prefix "D:\nodejs\node_global"…

本地大模型初体验

前言 近几年这个话题很火,但是我一直没得去尝试一下,今天突然来兴趣想试试,然后就出来了这一篇文档。 环境准备docker安装管理工具 Ollama是一款开源的大模型管理工具,它允许用户在本地便捷地运行多种大型开源模型,包括清华大学的ChatGLM、阿里的千问以及Meta的llama等。目…

Linux装逼玩法之wttr.in天气

什么是 wttr.in? wttr.in 是一个基于 Web 的命令行天气服务,由 Igor Chubin 开发。它通过调用OpenWeatherMap 等天气服务的 API,提供了简洁、直观的天气信息展示。 Linux使用Curl命令可快速获取天气信息查询指定城市的天气[Wed Jan 01 20:38:53 root@localhost ~ ]# curl wt…

vmware下载安装配置

vmware下载安装配置 下载 https://www.vmware.com/ # 官网 https://www.broadcom.com/ # Broadcom官网 https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion # VMware官网虚拟机下载页 https://www.filehorse.com/download-v…

软件安全测试

一、网络协议基础 1、网络模型 我们把一些过程封装到一起,称为“模型”,如下:把北京中的4个步骤封装到一起,就是1个模型了。 (1)网络模型-OSI OSl(Open System Interconnection 开放系统互联)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体…

开拓计划21/2025集训作业表3 - 倍增ST表LCA次小生成树

开拓计划21/2025集训作业表3 - 倍增&ST表&LCA&次小生成树 倍增&ST表 概念Q:倍增是什么? A:倍增,顾名思义是成倍增长的意思,它利用了二进制的性质和预处理(俗称打表)的思想,在 \(O(\log n)\) 内完成一些操作。 Q:ST表是什么? A:ST表主要用于解决RMQ(…

系统管理体系之进程管理

系统管理体系之进程管理 1. 进程名字 含义程序 安装包,程序代码,app,存放在磁盘上面.进程⭐️ 运行起来的程序,命令,服务(远程连接服务,网络服务)都可以称作进程。 运行在内存中。守护进程 守护进程, 一直运行的进程. 也可以叫做服务.2. 进程分类(异常进程) 2.1 僵尸进程⭐️⭐…

系统管理之服务管理---管理命令

1. 系统管理之服务管理---管理命令systemctl 管理服务开机自启动管理正在运行的服务.旧版本的系统:Centos 5.x 6.x 需要使用service 命令检查 sshd 远程连接服务状态systemctl status sshd systemctl status 单个或多个服务名如何设置开启开机自启动 systemctl enable sshd 当…