Codeforces Round #629 (Div. 3)
地址:https://codeforces.com/contest/1328
题意:a,b。a只能+1操作。求最少几步能整除b
解析:分类讨论即可。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--) { ll n,m; cin>>n>>m; if(n%m==0) cout<<"0"<<endl; else { if(n<m) cout<<m-n<<endl; else { ll mid=n/m; cout<<m*(mid+1)-n<<endl; } } } }
题意:长为n的只含a,b的字符串,含有2个b,n-2个a。给出k,求第k大的字符串。输出它
解析:规律题。。。这些字符串就是按字典序排列的。上图n=5,这张图是从右往左来记下标,表示每次b的两个出现位置。
L每次就成了一组等差数列:1,1,2,1,2,3,1,2,3,4.....而且发现,每个等差数列的和,恰好对应==k。根据d=1的等差数列求和公式(i*i+i)/2,找出第一个>=k的,这个i值,就是L下标的最大情况,L+1,就是R了。这个R是精准的。但是L怎么求?根据观察,实际的L就等于L-((L*L+L)/2-K)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int maxn=1e5+20; int main() { int t; cin>>t; while(t--) { ll n,m; cin>>n>>m; ll l,r; for(ll i=1;i<=n;i++) { if(i*i+i>=2*m) { l=i;break; } } ll md=(l*l+l)/2; r=l-((l*l+l)/2-m); for(ll i=n;i>=1;i--) { if(i==r||i==l+1) cout<<"b"; else cout<<'a'; } cout<<endl; } }
题意:给出长度为n的x,这个x开头必须是2,其他部分由0,1,2组成。求出长度同为n的两个数a,b,要求每一位xi==(ai+bi)%3,而且开头不为0。要求max(a,b)最小。
解析:往a,b那平分就行了。把它们当字符串处理,所以就是个字典序问题。每次比较a,b的大小,把数字尽量往它们身上平分。a!=b的话,大的给小,小的给大。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int maxn=1e5+20; int main() { int t; cin>>t; while(t--) { ll n; cin>>n; string s; cin>>s; string c1,c2; for(int i=0;i<s.length();i++) { if(i==0) { c1+='1'; c2+='1'; } else { if(s[i]=='2') { if(c1>c2) { c1+='0'; c2+='2'; } else if(c1==c2) { c1+='1'; c2+='1'; } else { c1+='2'; c2+='0'; } } if(s[i]=='1') { if(c1>c2) { c1+='0'; c2+='1'; } else { c1+='1'; c2+='0'; } } if(s[i]=='0') { c1+='0'; c2+='0'; } } } cout<<c1<<endl<<c2<<endl; } }
题意:n个动物,给出编号,不同编号表明不是同一种动物。要求给它们染色,保证相邻不相同的不能染同一种颜色。输出所需最少颜色数以及染色结果。!注意是个环!
解析:1:对于n是偶数的情况,那么只需要两种染料,1,2,1,2依次染就可以了。
2:n是奇数的话,如果没有出现两个相邻的是同一种动物,就需要三种燃料,1,2,1,2......3结尾染成3就可以了。
3:n是奇数,如果出现了两个相邻的是同一种动物(环,首尾相同也算),那么把它俩合并染上同一种颜色,那么总的就成偶数个了。1,2,1,2依次染下去就行了,总的燃料数是2。我这里为了避免麻烦,先判断了首尾相同的情况,没有的话再判断中间情况。注意,此题细节颇多,模拟的时候头脑一定要清晰。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=2e5+10; int a[maxn],b[maxn]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int ok1=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(i>1&&a[i]!=a[i-1]) ok1=1; } if(!ok1) { cout<<"1"<<endl; for(int i=1;i<=n;i++) { if(i<n) cout<<"1"<<" "; else cout<<"1"<<endl; } } else if(n%2==0) { cout<<"2"<<endl; for(int i=1;i<=n;i++) { if(i<n) { if(i%2!=0) cout<<"1"<<" "; else cout<<"2"<<" "; } else { if(i%2!=0) cout<<"1"<<endl; else cout<<"2"<<endl; } } } else { if(a[1]==a[n]) { cout<<"2"<<endl; cout<<"1"<<" "; for(int i=2;i<n;i++) { if(i%2==0) cout<<"2"<<" "; else cout<<"1"<<" "; } cout<<"1"<<endl; } else { int k=-1; for(int i=1;i<n;i++) { if(a[i]==a[i+1]) { k=i;break; } } if(k==-1) { cout<<"3"<<endl; for(int i=1;i<n;i++) { if(i%2!=0) cout<<"1"<<" "; else cout<<"2"<<" "; } cout<<"3"<<endl; } else { memset(b,0,sizeof(b)); cout<<"2"<<endl; if(k%2!=0) b[k]=1,b[k+1]=1; else b[k]=2,b[k+1]=2; for(int i=1;i<k;i++) { if(i%2!=0) b[i]=1; else b[i]=2; } for(int i=k+2;i<=n;i++) { if(i%2!=0) b[i]=2; else b[i]=1; } for(int i=1;i<n;i++) cout<<b[i]<<" "; cout<<b[n]<<endl; } } } } }