//译题★Broken Necklace 破碎的项链你有一条由N 个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子:1 2 1 2r b b r b r r br b b br r b rr r w rb r w wb b r rb b b bb b r br r b rb r r rb r r rr r r br b r r r w图片 A 图片 Br 代表 红色的珠子b 代表 蓝色的珠子w 代表 白色的珠子第一和第二个珠子在图片中已经被作记号.图片 A 中的项链可以用下面的字符串表示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb .假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事.(颜色可能与在这之前收集的不同) 确定应该在哪里打破项链来收集到最大多数的数目的子. Example 举例来说,在图片 A 中的项链,可以收集到8 个珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链. 在一些项链中,包括白色的珠子如图片 B 所示. 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色. 表现项链的字符串将会包括三符号 r , b 和 w . 写一个程序来确定从一条被供应的项链最大可以被收集珠子数目.PROGRAM NAME: beadsINPUT FORMAT第 1 行: N, 珠子的数目第 2 行: 一串度为N 的字符串, 每个字符是 r , b 或 w.SAMPLE INPUT (file beads.in)29wwwbbrwrbrbrrbrbrwrwwrbwrwrrbOUTPUT FORMAT单独的一行包含从被供应的项链可以被收集的珠子数目的最大值.SAMPLE OUTPUT (file beads.out)11
/*ID: china_l5LANG: CTASK:beads*/#include#include #define MAX (350 + 10)int main(){ freopen("beads.in", "r", stdin); freopen("beads.out", "w", stdout); int i, j, N, T; int max=0, count1, count2; char s[MAX*2], str[MAX], tmp; memset(s,0,sizeof(s)); scanf("%d",&N); //读入N getchar(); //如果没有这句,接受完会跳过下面的gets(str); gets(str); strcpy(s,str); //复制字符串 strcat(s,str); //连接字符串 ,将环转化为链 /* 或者使用下面方法将一个字符串存两遍使得环转化为链。 scanf("%d %s",&N, s); for(i=0;i =i;j--) //然后继续扫描 { if(s[j] == 'w') //如果是‘w’,count+1; 继续循环 { count2++; continue; } else if(s[j] == tmp) //如果字符和tmp相等,count+1,继续循环 { count2++; continue; } break; } max=(max>(count1+count2))?max:(count1+count2);// printf("%d %d %d\n",max,count1,count2); 可以用这句来查看count1,count2 和 max } if(max>N) max = N; printf("%d\n", max); return 0;}
精简后的代码
1 /* 2 ID: china_l5 3 LANG: C 4 TASK:beads 5 */ 6 #include7 #include 8 #define MAX (350 + 10) 9 10 int main()11 {12 freopen("beads.in", "r", stdin);13 freopen("beads.out", "w", stdout);14 15 int i, j, N, T;16 int max=0, count1, count2;17 char s[MAX*2], str[MAX], tmp;18 memset(s,0,sizeof(s));19 20 scanf("%d",&N); 21 getchar(); 22 gets(str);23 strcpy(s,str); 24 strcat(s,str); 25 26 for(i=0;i =i;j--) 56 {57 if(s[j]!=tmp && s[j]!='w') 58 break;59 count2++;60 }61 max=(max>(count1+count2))?max:(count1+count2); 62 }63 if(max>N) max = N;64 printf("%d\n", max);65 return 0;66 }