【CodeForces训练记录】Codeforces Round 1045 (Div. 2)
赛后反思
今天是猜猜乐场,结论猜对 CF 就能上2000了,有些题目说不上来为什么,因为是直觉
训练情况

A题
显然我们只需要考虑 \(n-a\) 与 \(n-b\) 染完色剩下的部分是否能平分成两份,同时记得判断后一次操作覆盖前一次操作的情况,即 \(b > a\) 并且 \(n-b\) 能分成两份
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,a,b; cin>>n>>a>>b;
if((n-a)%2==0 && (n-b)%2==0) cout<<"YES"<<endl;
else if(b>=a && (n-b)%2==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}
B题
我们考虑构造 \(k+1\) 的倍数,这样构造有一个好处就是每次 + k 可以等效成取模意义下的 -1,显然对 \(k+1\) 取模意义下,余数一定 \(\le k\),满足题目中操作次数的要求,所以我们只需要对于不是 \(k+1\) 的倍数,操作余数次,即可变为 \(k+1\) 的倍数,即让 \(\gcd = k+1\)
点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,k; cin>>n>>k;
vector<int> a(n + 1);
for(int i = 1;i<=n;i++) cin>>a[i];
if(k&1){
for(int i = 1;i<=n;i++) if(a[i]&1) a[i]+=k;
for(int i = 1;i<=n;i++) cout<<a[i]<<" "; cout<<endl;
} else {
for(int i = 1;i<=n;i++){
if(a[i] % (k+1)) a[i] += k * (a[i] % (k+1));
}
for(int i = 1;i<=n;i++) cout<<a[i]<<" "; cout<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}
C题
猜的结论,我们首先考虑 \(len = 2\) 子数组的情况,偶数位大于奇数位(是按照原数组的奇偶性,不是子数组的),所以对于偶数位需要和前一位和后一位比较,由于题目中只能减操作,所以减两个奇数位,之后我们考虑 \(len = 3\) 子数组的情况,判断偶数和是否 \(\ge\) 奇数和,如果不满足贪心优先减后面的奇数位,这样后面的操作可以更优,如果还不够再减前面的奇数位,emm...然后就对了
点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n; cin>>n;
vector<int> a(n + 3);
for(int i = 1;i<=n;i++) cin>>a[i];
int ans = 0;
for(int i = 2;i<=n;i+=2){
if(a[i] < a[i-1]){
ans += a[i-1] - a[i];
a[i-1] -= a[i-1] - a[i];
}
if(a[i] < a[i+1]){
ans += a[i+1] - a[i];
a[i+1] -= a[i+1] - a[i];
}
}
for(int i = 2;i<=n;i+=2){
if(a[i-1] + a[i+1] > a[i]){
ans += a[i-1] + a[i+1] - a[i];
int d = a[i-1] + a[i+1] - a[i];
a[i+1] -= min(a[i+1],d),d-=min(a[i+1],d);
if(d) a[i-1] -= d;
}
}
// ans += max(0ll,sum1 - sum2);
// for(int i = 1;i<=n;i++) cout<<a[i]<<" "; cout<<endl;
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}

浙公网安备 33010602011771号