破碎的项链

你有一条由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

 

猜你喜欢

转载自www.cnblogs.com/guoyujiang/p/11823521.html