题目链接:Codeforces Round #373 (Div. 2)
分析:只补了B,C,其他题再看看,做出几道说几道,QAQ
B题有两种操作,一种是交换两个字母的位置,另一种是改变字母,使得最后序列成为一个形如drdrd/rdrdr的序列。
在两种情况中取较小值。
我将奇数与偶数次位置分开处理,如果交换,则两个都加一;如果改变字母,则对应的奇/偶位置++,取两者较大者。
详情见代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 char s[100100]; 7 int op1,op2,n; 8 9 int check(char c) 10 { 11 int cou[2]={0,0}; 12 for(int i=1;i<=n;++i) if((s[i]==c) != (i&1)) cou[i&1]++; 13 return max(cou[0],cou[1]); 14 } 15 int main() 16 { 17 scanf("%d",&n); 18 scanf("%s",s+1); 19 printf("%d ",min(check('b'),check('r'))); 20 }
C题题意是t秒后能得到的最大值,那么首先要找到小数点后的第一个不小于5的数,然后往回处理,详情见代码。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 char s[200200]; 7 int pos,n,t,loc; 8 bool flag,vis; 9 10 int main() 11 { 12 scanf("%d %d",&n,&t); 13 scanf("%s",s); 14 while(s[loc]!='.' && loc < n) loc++; 15 pos=loc+1; 16 while(pos < n && s[pos] < '5') pos++; 17 if(pos == n) {printf("%s ",s);return 0;} 18 while(t > 0) 19 { 20 t--,pos--; 21 while(s[pos] == '9') pos--; 22 //printf("%s ",s); 23 if(s[pos] == '.') 24 { 25 //printf("%s ",s); 26 pos--; 27 while(pos >= 0 && s[pos] == '9') {s[pos] = '0';pos--;} 28 if(pos >= 0) 29 { 30 s[pos]++; 31 for(int i=0;i<loc;++i) printf("%c",s[i]);puts(""); 32 return 0; 33 } 34 printf("1"); 35 for(int i=0;i<loc;++i) printf("%c",s[i]);puts(""); 36 return 0; 37 } 38 s[pos]++; 39 if(s[pos] < '5') break; 40 } 41 for(int i = 0;i <= pos;++i) printf("%c",s[i]);puts(""); 42 }