【CodeForces训练记录】Codeforces Round 1045 (Div. 2)

赛后反思

今天是猜猜乐场,结论猜对 CF 就能上2000了,有些题目说不上来为什么,因为是直觉

训练情况

image

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;
}
posted @ 2025-08-27 00:35  MNNUACM_2024ZY  阅读(47)  评论(0)    收藏  举报