枚举一下 x x x 的值即可。
#includeB. Rising Sand#define pb push_back #define se second #define fi first using namespace std; typedef long long LL; typedef double db; const int N=1e6+10; const int mod=1e9+7; int a[N]; int main() { int _; scanf("%d",&_); while(_--) { int n; scanf("%d",&n); int ans=-1; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { int now=0; for(int j=1;j<=n;j++) { if(j!=i) now^=a[j]; } if(now==a[i]) { ans=a[i]; break; } } printf("%dn",ans); } return 0; }
可以发现,如果 k ≥ 2 kgeq2 k≥2 ,那么每一次增加不会让结果更优,如果 k = 1 k=1 k=1,答案为 n − 1 2 frac{n-1}{2} 2n−1。
#includeC. 3SUM Closure#define pb push_back #define se second #define fi first using namespace std; typedef long long LL; typedef double db; const int N=1e6+10; const int mod=1e9+7; int a[N]; int main() { int _; scanf("%d",&_); while(_--) { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int ans=0; for(int i=2;i if(a[i]>a[i+1]+a[i-1]) ans++; } if(k==1) { ans=(n-1)/2; } printf("%dn",ans); } return 0; }
可以看出,如果有超过三个以上的正数或者负数,则一定不符合题意,原因是这样的三个正数(负数)一定会组合成一个更大(小)的正数(负数),对于
0
0
0 来说,不管有多少个其实就只相当于有一个。
所以存一下剩下的数字,之后
n
3
n^3
n3 枚举即可。
#includeD. Fixed Point Guessing#define pb push_back #define se second #define fi first using namespace std; typedef long long LL; typedef double db; const int N=1e6+10; const int mod=1e9+7; LL a[N]; int main() { int _; scanf("%d",&_); while(_--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); bool flag=0; int num1=0,num2=0; vector v; map m; for(int i=1;i<=n;i++) { if(a[i]==0) flag=1,m[0]=1; else if(a[i]>0) num1++,v.pb(a[i]),m[a[i]]=1; else num2++,v.pb(a[i]),m[a[i]]=1; } if(num1>=3||num2>=3) { puts("NO"); continue; } if(flag) v.pb(0); n=v.size(); bool ans=1; for(int i=0;i for(int j=i+1;j for(int k=j+1;k if(!m[v[i]+v[j]+v[k]]) ans=0; } } } if(ans) puts("YES"); else puts("NO"); } return 0; }
要求在
15
15
15 次询问中得到答案,考虑二分。
把区间分为左右两部分,先询问左边的部分,如果在此区间内合法的数字有偶数个,则答案一定不在此区间之内,因为这偶数个数一定会两两配对之后进行交换,如果合法的数字有奇数个,则答案一定在这个区间之内。
如果不合法则对右区间进行拆分,否则拆分左区间。
#include#define pb push_back #define se second #define fi first using namespace std; typedef long long LL; typedef double db; const int N=1e6+10; const int mod=1e9+7; bool flag; int a[10110]; void ask(int l,int r){ printf("? %d %dn",l,r); cout.flush(); return ; } void solve(int l,int r){ if(l==r) { flag=1; printf("! %dn",l); cout.flush(); return ; } int mid=(l+r)>>1; ask(l,mid); for(int i=1;i<=mid-l+1;i++) scanf("%d",&a[i]); int num=0; for(int i=1;i<=mid-l+1;i++) { if(a[i]>=l&&a[i]<=mid) num++; } if(num%2) solve(l,mid); else solve(mid+1,r); return ; } int main() { int _; scanf("%d",&_); while(_--) { flag=0; int n; scanf("%d",&n); solve(1,n); } return 0; }



