【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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析