没读题的可以去这里看题:题目传送门
题解里好像没有这个做法,也就这篇题解和我的有点相似,所以我来水一发
首先我也不知道怎么想的,交了一发这个代码,得了20pts:
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,a[500001];
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
}
cout<<"YES";
return 0;
}
之后我发现题目里说:环上的每条边上都有一个非负整数,这些整数中至少有一个0
于是我便突发奇想:环上0的个数与结果有关联吗?
在纸上运算后得出了这样一个结论:如果0的个数为奇数就有必胜策略,反之亦然
于是就产生了这个代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,a[500001],sum=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
if(a[i]==0) sum++;
}
if(sum%2==1) cout<<"YES";
else cout<<"NO";
return 0;
}
交上去发现80pts
又看了一眼第二个样例,发现n不一定是偶数(feihua),所以就得出了一个新的结论:节点数-0的个数如果为奇数就有必胜策略,反之亦然
最终代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,a[500001],sum=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
if(a[i]==0) sum++;
}
if(sum%2==n%2) cout<<"NO";
else cout<<"YES";
return 0;
}
这样也可以:
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,a[500001],sum=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
if(a[i]==0) sum++;
}
if((n-sum)%2==1) cout<<"YES";
else cout<<"NO";
return 0;
}
这个结论是找规律得出的,哪位dalao可以证一下,或者找个hack数据卡掉这个代码
多谢诸位观看,记得点赞哦,如有建议欢迎私信