http://codeforces.com/contest/1303
A: 第一题给一个只有01的字符串,操作是可以删除0,结果要保证1都是挨着的。问最小操作数。
解析:特判,len=1是直接输出0。其他的就是找到第一个为1而且下一位为0的位置,以此往下找,找到第一个为1而且j!=i+1就可以了,减一下就是操作数。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1e3; int main() { int t; cin>>t; while(t--) { char s[maxn]; cin>>s; int len=strlen(s); int sum=0; if(len==1) cout<<"0"<<endl; else { //int sum=0; for(int i=0;i<len;i++) { if(s[i]=='1'&&s[i+1]=='0') { int k=-1; for(int j=i+1;j<len;j++) { if(s[j]=='1'&&j!=i+1) { k=j;break; } } if(k!=-1) sum+=k-i-1; } } cout<<sum<<endl; } } }
B
给出路长度n,good天数和bad天数,good天里完成的修路的质量高。要求n的一半为高质量,而且要完成长度n的修建,问最少需要多少天。
解析: 1.如果good>=n或者good>=n/2,直接输出n。
2.算出完成上述目标需要的天数。根据周期来看,算出good周期数:n/2/g, 则bad周期数就是good周期数-1。而如果mid/g不能整除
那么bad周期数还要+1。总公式就是:sum=bad周期数*bad+good周期数*good+n/2/g的余数。如果sum>n,输出n,否则输入sum
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 1e3; int main() { int t; cin>>t; while(t--) { ll n,g,b; cin>>n>>g>>b; if(n<=g) { cout<<n<<endl;continue; } int mid; if(n%2!=0) mid=n/2+1; else mid=n/2; if(g>=mid) cout<<n<<endl; else { int k=mid/g; int yu=0; int bb=k-1; if(mid%g!=0) { yu=mid%g; bb++; } // 19 7 3 2 //cout<<k<<" "; ll sum=bb*b+k*g+yu; //cout<<"bb: "<<bb<<" k: "<<k<<" yu: "<<yu<<endl; if(sum<=n) cout<<n<<endl; else cout<<sum<<endl; } } }
C: 给一个字符串,相邻字符不同,设计一个键盘,里面的下一个字母是当前字母的相邻位置。如果存在输出YES+布局,否则NO
解析: vis[] :标记字母是否出现
a[] :记录相邻情况
k :指向位置
初始a[]中间放上字符串的第一个字符,标记vis=1,k指向当前位置,然后for遍历,左右放就可以了。
放的时候对于当前要放的字符s[i],有两种情况:
1:之前出现过,那么看a[k]左右,如果a[k-1]==s[i]||a[k+1]==s[i],对应的
k左移或者右移。如果没满足相等条件,直接输出NO。
2:之前没出现过,看a[k]左右,哪个空,放哪儿,k对应的移动,并且vis[s[i]]==1。如果左右都不为空那么直接输出NO,因为
一个字母和三个字母相邻是不能实现键盘的。
结尾,输出a[]里的字符,再根据vis标记的来输出26个字母中没出现过的字符。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; typedef long long ll; typedef pair<char,char>p; int main() { int t; cin>>t; while(t--) { char s[210]; int vis[27]; char a[100]; memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); cin>>s; int k=27,no=0; a[k]=s[0]; vis[s[0]-'a']=1; for(int i=1;i<strlen(s);i++) { if(vis[s[i]-'a']) { if(a[k-1]==s[i]) { k--; } else if(a[k+1]==s[i]) { k++; } else { no=1;break; } } else { if(!a[k-1]) { k--; } else if(!a[k+1]) { k++; } else { no=1;break; } a[k]=s[i]; vis[s[i]-'a']=1; } } if(no) cout<<"NO"<<endl; else { cout<<"YES"<<endl; for(int i=0;i<100;i++) { if(a[i]>='a'&&a[i]<='z') cout<<a[i]; } for(int i=0;i<26;i++) { if(!vis[i]) cout<<char(i+'a'); } cout<<endl; } } }