A、长和宽一直除二到奇数就好了
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 9 int main(void){ 10 int t; 11 cin>>t; 12 while(t--){ 13 int w,h,n; 14 cin>>w>>h>>n; 15 int cnt=1; 16 while(w%2==0){ 17 cnt<<=1; 18 w/=2; 19 } 20 while(h%2==0){ 21 cnt<<=1; 22 h/=2; 23 } 24 if(cnt>=n){ 25 cout<<"YES"<<endl; 26 }else{ 27 cout<<"NO"<<endl; 28 } 29 } 30 return 0; 31 }
B、先把2的分完,看剩不剩下2,如果有,看能不能用1抵掉2,然后把1分完
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 9 int main(void){ 10 int t; 11 cin>>t; 12 while(t--){ 13 int n; 14 cin>>n; 15 int cnt=0; 16 for(int i=0;i<n;i++){ 17 int q; 18 cin>>q; 19 cnt+=q; 20 } 21 if(cnt%2==0&&n%2==0){ 22 cout<<"YES"<<endl; 23 }else{ 24 cout<<"NO"<<endl; 25 } 26 } 27 return 0; 28 }
C、倒着来一遍,每次如果没跳出去就加上你将要去到的格子的分数
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 typedef long long LL; 9 const int N=2e5+10; 10 LL f[N]; 11 int main(void){ 12 int t;x` 13 cin>>t; 14 while(t--){ 15 int n; 16 cin>>n; 17 for(int i=1;i<=n;i++){ 18 cin>>f[i]; 19 } 20 LL res=INT_MIN; 21 for(int i=n;i>=1;i--){ 22 if(f[i]+i<=n){ 23 f[i]+=f[f[i]+i]; 24 } 25 res=max(res,f[i]); 26 } 27 cout<<res<<endl; 28 } 29 return 0; 30 }
D、这个游戏就是要尽可能地自己多得分,让对手少得分,即让score_my - score_oth尽可能地大,所以每次拿最大的数就好了,因为如果你不拿,必然会被对手拿掉,
如果这个是你的分,那你完全可以获得更多的分,如果这个是对手的分,那么你刚刚拿的肯定小于他将要拿的,所以score_my - score_oth减小了
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 typedef long long LL; 9 const int N=2e5+10; 10 int f[N]; 11 bool cmp(int a,int b){ 12 return a>b; 13 } 14 int main(void){ 15 int t; 16 cin>>t; 17 while(t--){ 18 int n; 19 cin>>n; 20 for(int i=1;i<=n;i++){ 21 cin>>f[i]; 22 } 23 sort(f+1,f+n+1,cmp); 24 LL suma=0,sumb=0; 25 for(int i=1;i<=n;i++){ 26 if(i%2) 27 { 28 if(f[i]%2==0) 29 suma+=f[i]; 30 } 31 else 32 { 33 if(f[i]%2==1) 34 sumb+=f[i]; 35 } 36 } 37 if(suma>sumb){ 38 cout<<"Alice"<<endl; 39 }else if(sumb>suma){ 40 cout<<"Bob"<<endl; 41 }else{ 42 cout<<"Tie"<<endl; 43 } 44 } 45 return 0; 46 }
E、先按照高和宽的最大值排序,然后为每一个人找一个答案(假设升序排的),那么对于i,他的答案只可能在1~i-1之间,所以维护高和宽的最小值就可以知道答案了。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 struct node{ 5 int ma,mi; 6 int idx; 7 int ans; 8 }; 9 bool cmp(node a,node b){ 10 if(a.ma==b.ma) 11 return a.mi>b.mi; 12 return a.ma<b.ma; 13 } 14 bool cmpp(node a,node b){ 15 return a.idx<b.idx; 16 } 17 const int N=2e5+10; 18 node a[N]; 19 int main(void){ 20 int t; 21 cin>>t; 22 while(t--){ 23 int n; 24 cin>>n; 25 for(int i=1;i<=n;i++){ 26 cin>>a[i].ma>>a[i].mi; 27 if(a[i].ma<a[i].mi){ 28 swap(a[i].ma,a[i].mi); 29 } 30 a[i].idx=i; 31 } 32 sort(a+1,a+1+n,cmp); 33 int flag=-1; 34 for(int i=1;i<=n;i++){ 35 if(flag==-1){ 36 a[i].ans=-1; 37 }else{ 38 if(a[i].mi>a[flag].mi){ 39 a[i].ans=a[flag].idx; 40 }else{ 41 a[i].ans=-1; 42 } 43 } 44 if((flag==-1&&a[i].ma!=a[i+1].ma)||(flag!=-1&&a[i].mi<a[flag].mi)){ 45 flag=i; 46 } 47 } 48 sort(a+1,a+1+n,cmpp); 49 for(int i=1;i<=n;i++){ 50 cout<<a[i].ans<<" "; 51 } 52 cout<<endl; 53 } 54 return 0; 55 }