题目:A - Candies CodeForces - 1343A
题意:给一个数n,在k>1的情况下找一个x符合:x+2x+4x+?+2k−1x=nx+2x+4x+?+2k−1x=n.
做法:先求2n的前缀和,然后然后每一项进行判断。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=1e5+10; long long quick_power(int x, int y) { if(y==1)return x; if(y==0)return 1; long long res; if(y%2==0) { res=quick_power(x,y/2); res=res*res; } else { res=quick_power(x,y/2); res=res*res*x; } return res; } ll a[30]; int main(){ a[0]=1; for(int i = 1;i<=30;i++){ a[i]=quick_power(2,i); a[i]+=a[i-1]; } int t; cin>>t; while(t--){ int n; cin>>n; int flag = 0; for(int j = 1;j<=30;j++){ if(n%a[j]==0){ cout<<n/a[j]<<endl; break; } } } return 0; }
题目:B - Balanced Array CodeForces - 1343B
题意:给一个数n,给出n个长度的数组,前n/2个位偶数,后n/2位奇数,保证奇数加偶数相等。
做法:若n被2整除且不被4整除,容易看出两边不会相等因为这样奇数和永远都是奇数。当能够被4整除时,先随便给n/2个偶数,再随便给n/2-1个奇数,然后把偶数和减去奇数的和得到最后一个奇数。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=1e5+10;int main(){ int t; cin>>t; while(t--){ int n; ll l=0,r=0; cin>>n; if(n%4){ cout<<"NO"<<endl; } else{ cout<<"YES"<<endl; for(int i = 1;i<=n/2;i++){ cout<<i*2<<" "; l+=(i*2); } for(int i = 1;i<=n/2-1;i++){ cout<<(i-1)*2+1<<" "; r+=((i-1)*2+1); } cout<<l-r; cout<<endl; } } return 0; }
题目:C - Ichihime and Triangle CodeForces - 1337A
题意:给出四个数,a, b, c, d, a≤b≤c≤d.。然后在四个数间找三个数x ,y, z.
做法:我们容易找到三条边越相近越好,因此x=b,z=c。这也是题意的最符合的x与z。再根据三角形的性质,两边之差小于第三边y > c-b。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=1e5+10; int main(){ int t; cin>>t; while(t--){ int a,b,c,d; cin>>a>>b>>c>>d; int tmp; for(int i =c;i>=b;i--){ if(i>c-b){ tmp=i; break; } } cout<<b<<" "<<tmp<<" "<<c<<endl;; } return 0; }
题目:D - Kana and Dragon Quest game CodeForces - 1337B
题意:给一个数n,然后有两种操作,第一种操作消耗将n=n/2+10,操作次数为a,第二种为n-10,操作次数为b。在两种操作次数内可不可以将n操作到n<=0.
做法:先使用第一种,但是判断剩余的n可不可以仅使用b完成。如果不可以接着使用第一种,可以的话,直接使用b。最后判断n的值。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=3e6+10; int main(){ int t; cin>>t; while(t--){ int x,a,b; cin>>x>>a>>b; while(a>0||b>0){ if(x>10*b&&a>0){ x=x/2+10; a--; } else if(b>0){ x-=10; b--; } if(x<=0) break; } if(x<=0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
题目:E - Candies and Two Sisters CodeForces - 1335A
做法:为奇数的时候1……n/2,与n/2+1……n-1结合一下。偶数的时候去掉两个相等的时候。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=3e6+10; int main(){ int t; cin>>t; while(t--){ ll n; cin>>n; if(n%2){ cout<<n/2<<endl; } else{ cout<<n/2-1<<endl; } } return 0; }
题目:F - Construct the String CodeForces - 1335B
题意:给出三个数n, a, b。让你给出一个长度为n的字符串,保证每a个连着的字符穿,至少有b个不同的字符。
做法:直接输出b个不同的字符,在‘a‘……‘a‘+len(b)-1之间循环,保证在‘a‘……‘z‘之间,长度为n。因为保证存在了。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=3e6+10; int main(){ int t; cin>>t; while(t--){ ll n,a,b; cin>>n>>a>>b; char s=‘a‘; int in=0; for(int i = 1;i<=n;i++,in++){ printf("%c",s); if(s==‘z‘) s=‘a‘; else if(s==‘a‘+b-1) s=‘a‘; else s=s+1; } cout<<endl; } return 0; }
原文:https://www.cnblogs.com/aixiaodezsh/p/12968616.html