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

训练情况

赛后反思

开局连WA就知道这把完蛋了,应该要掉大分了,A题没考虑清楚,B题犯傻了一时间没看出来结论

A题

当且仅当两个人贴贴的时候,轮到谁走谁就输,后手可以把先手逼到两边,如果两人之间有一段距离,两人都必须往中间靠,如果两个人都往同一边走距离不变为无效操作,所以两人的距离为奇数的时候不存在先手必胜,两人的距离为偶数的时候先手必胜

#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(abs(a-b)%2==1) cout<<"NO"<<endl;
    else cout<<"YES"<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

B题

我们只能选择一个位置进行操作,若选择了两个及其以上的位置是无效操作。

例如

+1 -1 -1 -1 -1
-1 -1 -1 -1 + 1

最后的贡献为

0 -2 -2 -2 0

例如

+2 -2 -2 -2 -2
-1 -1 -1 -1 +1

最后的贡献为

+1 -3 -3 -3 -1

不如只选第一个操作

综上我们只要枚举操作哪一个位置即可,如果已经全部 \(>b_i\) 则为 YES,否则需要进一步判断,判断枚举那个位置之外的元素是否在操作后能满足要求即可。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n; cin>>n;
    vector<int> a(n + 1),b(n + 1);
    for(int i = 1;i<=n;i++) cin>>a[i];
    for(int i = 1;i<=n;i++) cin>>b[i];
    int ans = 0;
    int pos = 0;
    int now = 0;
    for(int i = 1;i<=n;i++){
        if(a[i]<b[i]) now=b[i]-a[i],pos=i,ans++;
    }
    bool flag = true;
    for(int i = 1;i<=n;i++){
        if(i==pos) continue;
        if(a[i]-now<b[i]) flag = false;
    }
    if(ans==0||(ans==1&&flag)) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}
posted @   MNNUACM_2024ZY  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示