Codeforces Round #765 (Div. 2)题解
作者:@cherish.
课程学习内容为作者从学校的PPT处摘抄,仅供自己学习参考,若需转载请注明出处:https://www.cnblogs.com/cherish-/p/15796912.html
目前补到C
A. Ancient Civilization
题目描述:给你个长度为的二进制数组,这些二进制数以十进制的形式给你,让你求一个最小的位二进制数,定义表示两个数字二进制表示下不同位的个数,如1001
和1100
,。求最小的使和式的值最小。
思路:显然将的每一位拆开,若的第位的数量小于的一半,那么对答案的贡献为0 << j
否则对答案的贡献是1 << j
。
时间复杂度:
参考代码:
int n, l, a;
void solve() {
cin >> n >> l;
vector<int> cnt(l, 0);
for (int i = 1; i <= n; ++i) {
cin >> a;
for (int j = 0; j < l; ++j) cnt[j] += a >> j & 1;
}
int res = 0;
for (int i = 0; i < l; ++i) {
int dx = 2 * cnt[i] > n;
res |= dx << i;
}
cout << res << '\n';
return;
}
B. Elementary Particles
题目描述:给你一个长度为的数组,求最长的整数,使得数组存在两个不同的长度为的子段,且,使得。
数据范围:
思路:考虑到只需要存在即可,我们可以将相同数字的下标存下来,然后遍历每一个相同的数字,若当前数字个数小于,跳过,否则枚举相邻两个相同的数字,假设其下标为,则其向左边最多取(包含当前下标),向右边最多取(不包含当前下标),那么最终的长度就为
对于所有的取最大值即可。注意为了不重复遍历需要进行去重。
时间复杂度:
空间复杂度:
参考代码:
const int N = 2e5 + 5;
vector<vector<int>>g(N);
int n;
void solve() {
cin >> n;
vector<int>a(n + 1, 0);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
g[a[i]].push_back(i);
}
std::sort(a.begin(), a.end());
int m = unique(a.begin(), a.end()) - a.begin();
int res = -1;
for (int i = 1; i < m; ++i) {
if (g[a[i]].size() < 2) continue;
int len = g[a[i]].size();
for (int j = 1; j < len; ++j) {
int u = g[a[i]][j - 1], v = g[a[i]][j];
int lr = min(u, v), rs = min(n - v, n - u);
res = max(res, lr + rs);
}
}
cout << res << '\n';
for (int i = 1; i < m; ++i) g[a[i]].clear();
return;
}
C. Road Optimization
题目描述:给你一个长度为的数组,和一个长度为的数组,(注:实际给你的只有个,)。其价值的计算公式为:
现让你删除其中的不超过个元素,求。
数据范围:
思路:比较显然的,定义状态表示以第个数结尾删除个数字后所能取得的最小值,则最终答案为:
考虑如何转移,假设枚举表示要删除该区间内的所有元素,则此时区间对答案的贡献为。则转移方程为:
时间复杂度:
参考代码:
int n, l, k;
void solve() {
cin >> n >> l >> k;
vector<int>d(n + 2, 0), a(n + 1, 0);
for (int i = 1; i <= n; ++i) cin >> d[i];
for (int i = 1; i <= n; ++i) cin >> a[i];
d[n + 1] = l;
vector<vector<int>>f(n + 1, vector<int>(k + 1, 0x3f3f3f3f));
int res = INT_MAX;
f[0][0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
int len = j - i;
for (int r = 0; r + len <= k; ++r) {
f[j][r + len] = min(f[j][r + len], f[i - 1][r] + (d[j + 1] - d[i]) * a[i]);
}
}
}
for (int i = 0; i <= k; ++i) res = min(res, f[n][i]);
cout << res << '\n';
return;
}
作者:cherish.
出处:https://home.cnblogs.com/u/cherish-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!