破碎的项链
作者:互联网
你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:
第一和第二个珠子在图片中已经被作记号。
图片 A 中的项链可以用下面的字符串表示:
brbrrrbbbrrrrrbrrbbrbbbbrrrrb
假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大多数的数目的子。 Example 举例来说,在图片 A 中的项链,可以收集到8个珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链。 在一些项链中,包括白色的珠子如图片 B 所示。 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。 表现项链的字符串将会包括三符号 r , b 和 w 。 写一个程序来确定从一条被供应的项链最大可以被收集珠子数目。
第一遍:最直白
思路:
1、遍历每一个字符,遇到‘w’则pass,‘r’和‘b’执行操作
2、对于执行操作的字符,分两个方向,因为断链出来了两段;对于每一个方向,还包含两个子方向,使用while循环进行爬链
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char arr[360]; 5 int n; 6 void solve() 7 { 8 //Init 9 memset(arr,0,360*sizeof(char)); 10 cin>>n; 11 cin>>arr; 12 //solveIt 13 int j,Max=0; 14 for(int i=0; i<n; i++) 15 { 16 if(arr[i]=='w') 17 continue; 18 //pass 'w',from 'r'and'b' 19 int max1=0,ct=1; 20 char ch = arr[i]; 21 j = i; 22 bool jdg = true; 23 //inOrder 24 while(jdg) 25 { 26 //ct=1/ct=2 27 if(ct==1&&(arr[j]=='w'||arr[j]==ch)) 28 { 29 j = (j+1)%n; 30 max1++; 31 }else if(ct==1&&arr[j]!=ch){ 32 j = (i==0)?(n-1):(i-1); 33 ct++; 34 if(arr[j]=='w'||arr[j]==ch){ 35 max1++; 36 j = (j==0)?(n-1):(j-1); 37 } 38 else 39 { 40 max1++; 41 ch = arr[j]; 42 j = (j==0)?(n-1):(j-1); 43 } 44 }else if(ct==2&&(arr[j]=='w'||arr[j]==ch)) 45 { 46 max1++; 47 j = (j==0)?(n-1):(j-1); 48 }else if(ct==2&&arr[j]!=ch&&arr[j]!='w') 49 { 50 jdg = false; 51 } 52 else 53 continue; 54 //general 55 if(max1>n){ 56 max1 = n; 57 jdg=false; 58 } 59 } 60 //backOrder 61 int max2=0; 62 ct=1; 63 jdg = true; 64 j = (i==0)?(n-1):(i-1); 65 ch = arr[j]; 66 while(jdg) 67 { 68 if(ct==1&&(arr[j]=='w'||arr[j]==ch)){ 69 j = (j==0)?(n-1):(j-1); 70 max2++; 71 }else if(ct==1&&arr[j]!=ch){ 72 j = i; 73 ct++; 74 if(arr[j]=='w'||arr[j]==ch){ 75 max2++; 76 j = (j+1)%n; 77 }else{ 78 ch = arr[j]; 79 max2++; 80 j = (j+1)%n; 81 } 82 }else if(ct==2&&(arr[j]=='w'||arr[j]==ch)){ 83 max2++; 84 j = (j+1)%n; 85 }else if(ct==2&&arr[j]!='w'&&arr[j]!=ch){ 86 jdg=false; 87 } 88 if(max2>n){ 89 max2 = n; 90 jdg=false; 91 } 92 } 93 Max = Max>max1?Max:max1; 94 Max = Max>max2?Max:max2; 95 } 96 if(Max) 97 cout<<Max<<endl; 98 else 99 cout<<n<<endl; 100 } 101 int main() 102 { 103 solve(); 104 return 0; 105 }First
标签:arr,ch,max2,Max,破碎,珠子,项链 来源: https://www.cnblogs.com/guoyujiang/p/11823521.html