CF#653 div.3 A-E
A:纯白送
#include<stdio.h> int main() { int t; int x,y,n,k,temp; scanf("%d",&t); while(t--) { scanf("%d %d %d",&x,&y,&n); temp=n-n%x; temp=temp+y; if(temp>n) k=temp-x; else k=temp; printf("%d\n",k); } return 0; }
B:纯白送
include<stdio.h> #include<iostream> using namespace std; int main() { int t,add1,add2,k; cin>>t; while(t--) { cin>>k; add1=0;add2=0; while(k%2==0) { add1++; k=k/2; } while(k%3==0) { add2++; k=k/3; } if(k!=1||add2<add1) { printf("-1\n"); continue; } printf("%d\n",add2*2-add1); } return 0; }
C:纯白送。这题以前做过类似的,问你一个括号序列合法不合法,是那道题的略微加强版本。
#include<stdio.h> #include<iostream> using namespace std; int main() { int t,k,s,p1,p2; cin>>t; char c; while(t--) { s=0,p1=0,p2=0; cin>>k; c=getchar(); while(k--) { c=getchar(); if(c=='(') p1++; if(c==')') p2++; if(p2>p1) { s++; p2--; } } cout<<s<<endl; } return 0; }
D:给(k-n%k)%k排个序即可,注意到要用long long。
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int main() { long long t; cin>>t; long long p[200000],q[200000],add,n,k; long long t1=0,t2=0,tn; while(t--) { cin>>n>>k; t1=0;t2=0; for(add=0;add<n;add++) { cin>>p[add]; q[add]=k-p[add]%k; if(q[add]==k) q[add]=0; } sort(q,q+n); tn=0; for(add=1;add<n;add++) { if(q[add]==q[add-1]) tn++; else { if(tn>=t1&&q[add-1]!=0) { t1=tn; t2=q[add-1]; } tn=0; } //printf("?%lld %lld %lld %lld?\n",add,tn,t1,t2); } if(tn>=t1&&q[add-1]!=0) { t1=tn; t2=q[add-1]; } if(t2==0) printf("%lld\n",t1*k+t2); else printf("%lld\n",t1*k+t2+1); /*for(add=0;add<n;add++) { printf("[%lld]",q[add]); } printf("{%lld %lld}\n\n",t1,t2);*/ } return 0; }
E:把所有只有alice喜欢的和bob喜欢的书分别排序,然后从最小的开始各挑一本加起来当做一本书,放进两个人都喜欢的的书的数组里,最后对都喜欢的书的数组排序即可。
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; long long p[200000],q[200000],r[200000]; int main() { long long add,n,k,a=0,b=0,c=0,a1,b1,c1,sum=0; cin>>n>>k; for(add=0;add<n;add++) { cin>>a1>>b1>>c1; if(b1&&c1) { p[a]=a1; a++; } else if(b1) { q[b]=a1; b++; } else if(c1) { r[c]=a1; c++; } } if(a+b<k||a+c<k) { printf("-1\n"); return 0; } sort(q,q+b); sort(r,r+c); if(b<c) { for(add=a;add<a+b;add++) { p[add]=q[add-a]+r[add-a]; } n=a+b; } else { for(add=a;add<a+c;add++) { p[add]=q[add-a]+r[add-a]; } n=a+c; } /*printf("|"); for(add=0;add<n;add++) printf("%lld ",p[add]); printf("|");*/ sort(p,p+n); /*printf("|"); for(add=0;add<n;add++) printf("%lld ",p[add]); printf("|");*/ for(add=0;add<k;add++) { sum+=p[add]; } printf("%lld",sum); return 0; }
sort函数是真的方便。