Codeforces Round #772(Div.2) [A~D]
链接:contest link
A.Min or Sum
题目
给定一个长度为 的数组 ,可以执行任意次如下操作:
- 任取两个整数 ,使 , 需要满足
求执行操作后数组元素和的最小值
分析
设 , 在执行操作的过程中是不变的
而 ,所以元素和的最小值为 ,考虑如何操作才能取到最小值,对于任意 使 即可
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
int n, a, res = 0;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a;
res = res | a;
}
cout << res << endl;
}
return 0;
}
B.Avoid Local Maximums
题目
给定一个长度为 的数组 ,可以执行如下操作:
- 任取一个整数 ,使 , 满足
求最少的操作数,使数组不存在局部最大值
局部最大值的定义是:如果 且 那么 就是局部最大值
分析
当我们找到一个局部最大值 时,有 ,那么我们可以修改 ,当 时让 ,这样 就都不可能成为局部最大值,当 时让 ,同样, 都不可能成为局部最大值。所以贪心策略是: 为局部最大值时使
代码
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
int a[MAX_N];
int n;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
a[n + 1] = 0;
int cnt = 0;
for(int i = 3; i <= n; i++) {
if(a[i] < a[i - 1] && a[i - 1] > a[i - 2]) {
a[i] = max(a[i - 1], a[i + 1]);
cnt++;
}
}
cout << cnt << endl;
for(int i = 1; i <= n; i++)
cout << a[i] << ' ';
cout << endl;
}
return 0;
}
C.Differential Sorting
题目
给定一个长度为 的数组 ,可以执行如下操作:
- 任取三个整数 ,使
求如何操作能使数组变为非减序列,即
不要求操作数最小
分析
考虑序列的最后三个数 ,由上述规则可知 和 无法更改,如果 ,那么无论怎么操作都不可能使序列非减
如果
- 当 时我们可以遵循一个简单的策略: 时依次执行操作 ,那么
- 当 时 只有在 才可保证序列非减,否则 ,同理可推 ,所以只有原序列满足非减时才能进行 次操作,否则无论如何操作都不可能使序列非减
代码
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
long long a[MAX_N];
int n;
struct node {
int x, y, z;
} step[MAX_N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
if(a[n - 1] > a[n]) {
cout << -1 << endl;
} else {
int cnt = 0;
bool fnd = true;
for(int i = n - 2; i >= 1; i--) {
if(a[i] > a[i + 1]) {
if(a[n] >= 0) {
a[i] = a[i + 1] - a[n];
step[++cnt] = {i, i + 1, n};
} else {
fnd = false;
break;
}
}
}
if(fnd) {
cout << cnt << endl;
for(int i = 1; i <= cnt; i++)
cout << step[i].x << ' ' << step[i].y << ' ' << step[i].z << endl;
} else {
cout << -1 << endl;
}
}
}
return 0;
}
D.Infinite Set
题目
给定一个长度为 的数组 ,每个元素互不相同,设集合 为包含所有满足以下条件的整数 :
- 且
- 且
给定 ,求 中小于 的元素个数
分析
参考官方题解,推理自然简明:tutorial
代码
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
const int MOD = 1e9 + 7;
int n, p, ans = 0;
int a[MAX_N], f[MAX_N], cnt[MAX_N];
set<int> useful;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> p;
for(int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++) {
int x = a[i];
bool flag = false;
while(x > 0) {
if(useful.count(x)) {
flag = true;
break;
}
if(x % 2)
x /= 2;
else if(x % 4 == 0)
x /= 4;
else
break;
}
if(!flag)
useful.insert(a[i]);
}
for(int x : useful)
cnt[__lg(x)]++;
for(int i = 0; i < p; i++) {
f[i] = cnt[i];
if(i >= 1)
f[i] = (f[i] + f[i - 1]) % MOD;
if(i >= 2)
f[i] = (f[i] + f[i - 2]) % MOD;
ans = (ans + f[i]) % MOD;
}
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】