A - Sum of Odd Integers
给定两个数n,k,判断n能否是k个不同的奇数的和
如果n为偶数,则k必须也为偶数才能成立;n为奇数,k也为奇数
还得保证最小的k个奇数的和,小于等于n
int main() { long long t,a,b; cin>>t; while(t--){ cin>>a>>b; if(a%2 != b%2){ cout<<"NO"<<endl; }else{ if(a<b*b){ cout<<"NO"<<endl; }else{ cout<<"YES"<<endl; } } } return 0; }
B - Princesses and Princes
有n个公主和n个王子,每个公主都有心仪王子的清单,从这个列表上选一个靠前的且没有婚配的王子,做好标记,
如果最后都能婚配输出OPTIMAL,如果不能,输出任意一个没有婚配的公主和王子
int b[100010]={0},a[100010]={0},c[100010]={0}; int main() { int n,t,i,j,n2; cin>>t; while(t--) { cin>>n; for(i=1; i<=n; i++) { cin>>n2; for(j=1; j<=n2; j++) { cin>>a[j]; } for(j=1; j<=n2; j++) { if(b[a[j]]==0) { b[a[j]]=1; c[i]=1; break; } } } int flag=0; for(i=1;i<=n;i++){ if(c[i]==0){ cout<<"IMPROVE"<<endl; for(j=1;j<=n;j++){ if(b[j]==0){ cout<<i<<" "<<j<<endl; flag=1; break; } } if(j!=n+1){ break; } } } if(flag==0) cout<<"OPTIMAL"<<endl; for(i=1;i<=n;i++){ a[i]=0; b[i]=0; c[i]=0; } } return 0; }
C - EhAb AnD gCd
给定一个x,输出满足gcd(a,b)+lcm(a,b)=x 的a,b
即输出1和x-1即可
int main() { long long t,a,b; cin>>t; while(t--){ cin>>a; cout<<1<<" "<<a-1<<endl; } return 0; }
D - CopyCopyCopyCopyCopy
给定一个长度为n的数组,将数组重复n次,求最大递增子序列的长度(子序列可以不是连续的)
求出有多少个不同的元素即可
int main() { int t,b,ccc,n,i; cin>>t; while(t--){ cin>>n; set<int> a; ccc=0; for(i=0;i<n;i++){ cin>>b; if(a.find(b)==a.end()){ a.insert(b); ccc++; } } cout<<ccc<<endl; } return 0; }
F - Yet Another Tetris Problem
给定n个方块的高度,额外还有很多高度为2的方块,能否消去所有行
全部为奇数或全部为偶数就可以消去(差别才能是2的倍数)
int main() { int t,n,a,b,c,i; cin>>t; while(t--){ cin>>n; a=0,b=0; for(i=0;i<n;i++){ cin>>c; if(c%2==0){ a++; }else{ b++; } } if(a==n||b==n){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } return 0; }
G - Yet Another Palindrome Problem
求一个数列能否有长度大于三的回文子数列(顺序不能改变,可以不连续)
找是否存在两个不相邻的相同元素
int main() { int n,t,i,b[5100]; cin>>t; while(t--){ cin>>n; int flag=0,a[5100]={0}; for(i=0;i<n;i++){ cin>>b[i]; a[b[i]]++; if(a[b[i]]>=2){ if(a[b[i]]==2){ if(b[i]!=b[i-1]){ flag=1; } }else{ flag=1; } } } if(flag==1){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } return 0; }
H - Frog Jumps
给定一个长度为n的字符串,只由L、R构成,在R上只能向右跳,在L上只能向左跳,从0跳到N+1,每次最多跳长度d,求d的最小值
给这个字符串的左右两端都加上R,遍历求相近两个R距离的最大值
int main() { int n,t,i,b[5100]; cin>>t; while(t--){ string s="R",s1; cin>>s1; s+=s1; n=s.length(); s+='R'; //cout<<s<<endl; int maxx=0,flag=0; for(i=0;i<n+1;i++){ if(s[i]=='R'){ maxx=max(maxx,i-flag); //cout<<maxx<<endl; flag=i; } } cout<<maxx<<endl; } return 0; }