Codeforces Round #640 (Div. 4) A->G
地址:http://codeforces.com/contest/1352
题意:将给出的数拆成最少的d000,,,形式
解析:拆的话,太麻烦,直接用string即可
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn=1e4+10; int a[maxn]; int nu[7]={10,100,1000,10000}; int main() { int t; cin>>t; while(t--) { string s; cin>>s; int len=s.length(); int tot=0; for(int i=0;i<len;i++) { if(s[i]!='0') tot++; } cout<<tot<<endl; for(int i=0;i<len;i++) { if(s[i]!='0') { cout<<s[i]; for(int j=i+1;j<len;j++) cout<<'0'; cout<<" "; } } cout<<endl; } }
题意:构造长度为k的序列,要求全体奇偶性相同而且和为n。不存在输出NO
解析:分类讨论即可。全放1或全放2,再看差值奇偶性。k>n肯定是不可能构造出的。写的有点繁琐了......
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn=1e4+10; int main() { int t; cin>>t; while(t--) { int n,k; cin>>n>>k; if(k>n) { cout<<"NO"<<endl;continue; } int ok1=0,ok2=0; if(k*1==n) { cout<<"YES"<<endl; for(int i=1;i<=k;i++) cout<<"1"<<" "; cout<<endl; continue; } if(k*1<n) { int md=n-(k-1); if(md%2==0) { ok1=1; } else { cout<<"YES"<<endl; for(int i=1;i<k;i++) cout<<"1"<<" "; cout<<md<<endl; continue; } } if(k*2>n) { cout<<"NO"<<endl;continue; } if(k*2==n) { cout<<"YES"<<endl; for(int i=1;i<=k;i++) cout<<"2"<<" "; cout<<endl; continue; } if(k*2<n) { int md=n-(k-1)*2; if(md%2!=0) ok2=1; else { cout<<"YES"<<endl; for(int i=1;i<k;i++) cout<<"2"<<" "; cout<<md<<endl; continue; } } if(ok1&&ok2) cout<<"NO"<<endl; } }
题意:无限长序列的数按不能被n整除排序,求第k个
解析:看间距就可以了,没啥说的。
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn=1e9+10; int main() { int t; cin>>t; while(t--) { ll n , k; cin>>n>>k; ll sum=0; if(k<n) cout<<k<<endl; else { ll md=k/(n-1); ll md2=k%(n-1); if(md2!=0) { cout<<md*n+md2<<endl; } else cout<<md*n-1<<endl; } } }
题意:两个人各从首尾开始吃,要求一个人吃的要比另一个人上次吃的多,求把所有糖果吃完需要的步骤数以及两人各吃的权值。
解析:暴力模拟,注意下细节即可。要吃的大于另一个人吃的而不是大于等于,这里注意一下。
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; int a[maxn]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int l=0,r=0,ans=0; ans=1; l=a[1]; int ll=2,rr=n; int ok=0; int sumr=0,suml=a[1]; while(1) { int md=0,i; if(!ok) { for(i=rr;i>=ll;i--) { r+=a[i]; sumr+=a[i]; if(sumr>suml) { ans++; suml=0; rr=i-1; md=1; break; } } ok=1; } else { for(i=ll;i<=rr;i++) { l+=a[i]; suml+=a[i]; if(suml>sumr) { ans++; sumr=0; ll=i+1; md=1; break; } } ok=0; } if(!md) { //cout<<ll<<"-"<<rr<<endl; if(ll<=rr) ans++; break; } } cout<<ans<<" "<<l<<" "<<r<<endl; } }
题意:找出特殊数的数目,特殊数ai=al+....+ar。而且每个数<=n。
解析: 先前缀和处理。然后暴力找到每一个区间,如果某段区间和<=n,那么说明这段区间和是有可能等于某个ai(已知ai<=n)的,把它标记。然后遍历整个序列,如果被标记了,说明有一段区间和是等于它的,它就是一个特殊数。
//´ÓпªÊ¼~ #include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn=8e3+10; int a[maxn],vis[maxn],num[maxn]; int main() { int t; cin>>t; while(t--) { int n ; memset(vis,0,sizeof(vis)); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) num[i]=num[i-1]+a[i]; for(int i=2;i<=n;i++) { for(int j=0;j<i-1;j++) { int md=num[i]-num[j]; if(md<=n) vis[md]=1; } } int ans=0; for(int i=1;i<=n;i++) { if(vis[a[i]]) ans++; } cout<<ans<<endl; } }
题意:构造一个序列,满足给定的00数,01数,11数。
解析:先构造000...,然后是11111.....,最后是010101.....题中已经规定必然存在解,那么当01数为0的时候,00和01是不可能全不为0的。所以可以先让01数为0,分开讨论输出。01不为0,就可以直接构造,但是注意0000011111中间有个01,这里是要算一个01数的,所以打印01的时候,少打一个即可。
//´ÓпªÊ¼~ #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn=2e5+10; int main() { int t; cin>>t; while(t--) { int a,b,c; cin>>a>>b>>c; if(b==0) { if(a!=0) { for(int i=1;i<=a+1;i++) cout<<0; cout<<endl; } if(c!=0) { for(int i=1;i<=c+1;i++) cout<<1; cout<<endl; } continue; } for(int i=1;i<=a+1;i++) cout<<0; for(int i=1;i<=c+1;i++) cout<<1; for(int i=0;i<b-1;i++) cout<<i%2; cout<<endl; } }
题意:给出n,有一个含有n个数而且大小为1-n。构造出一个排列顺序,使得每个数的间距大于等于2小于等于4。
解析:n<=3,是肯定无解的。我这里是根据奇偶性来构造,比如n是奇数,可以先1 3 5 ......然后打印偶数,但是要先把第二大和第一大的偶数打出来,然后再打比第二大小的,具体看代码:
//从新开始~ #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn=2e5+10; int main() { int t; cin>>t; while(t--) { int n; cin>>n; if(n<=3) { cout<<"-1"<<endl;continue; } if(n%2==0) { for(int i=2;i<=n;i+=2) { cout<<i<<" "; } cout<<n-3<<" "<<n-1<<" "; for(int i=n-5;i>=1;i-=2) cout<<i<<" "; } else { for(int i=1;i<=n;i+=2) cout<<i<<" "; cout<<n-3<<" "<<n-1<<" "; for(int i=n-5;i>=1;i-=2) cout<<i<<" "; } cout<<endl; } }