珠子什麼的最討厭了。。

珠子

Time Limit 1000ms

Memory Limit 65536K

description

小林有一串珠子,是由很多個大小不同的珠子串聯在一起組成的圓環型的,且其中每個珠子的大小可以用int型的整數來表示。小林有一個愛好就是數珠子,他想數那些位置相鄰而且大小隻相差1的珠子組成單調遞增或單調遞減的最長串是多長,比如說現在他有5個珠子,大小分別爲2 3 4 9 22,那麼這串珠子最長的符合要求的串的長度爲3,而如果是 3 4 3 9 22 這個的話那麼最長的有兩條,3 4 和 4 3,但是長度相同答案爲2。

input

數據有多個樣例,每個樣例的第一行給出一個n(0< n < 10),代表這串珠子的總長度(珠子是圓環型的首尾相連的),接着第二行給出n個數字,代表這n個珠子的大小。

output

請輸出這串珠子中最長的符合要求的子串的長度

sample_input

5
2 3 4 9 22
5
3 4 9 22 2
5
3 4 3 9 22

sample_output

3 
3
2

hint

source





點擊打開鏈接





#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int n,f=-10,l=1,tl=1,f1=-10,l1=1,tl1=1;    
    while(~scanf("%d",&n))
    {
      int a[n];                      
      for(int i=0;i<n;i++)
      {
        scanf("%d",&a[i]);
      }                                                         
       for(int j=0;j<2*n;j++)                                      
       {
               int i;
               i=j%n;
               if(a[i]-f==1)
               {l++;f=a[i];}
               else 
               {if(l>tl)tl=l;l=1;}
        f=a[i]; 
        }
        for(int j=0;j<2*n;j++)
       {
                 int i;
                 i=j%n;
                 if(a[i]-f1==-1)
                 {l1++;f1=a[i];}
                 else 
                 {if(l1>tl1)tl1=l1;l1=1;}
        f1=a[i]; 
        }
       printf("%d\n",tl>tl1?tl:tl1); 
       l=1; tl=1;f=-10; l1=1; tl1=1;f1=-10;              
     }
    system("PAUSE");
    return EXIT_SUCCESS;
}

主要的實現部分是


       for(int j=0;j<2*n;j++)                                      
       {
               int i;
               i=j%n;
               if(a[i]-f==1)
               {l++;f=a[i];}
               else 
               {if(l>tl)tl=l;l=1;}
        f=a[i]; 
        }






這題主要要解決末尾要與開頭相連的問題,



把題中說得那串珠子a【n】變成b【2*n】

其中b【0<n】就是a【n】,b【n<2*n】也是a【n】

其實就是2個a連在一起,

這樣就解決了題中要用到的“環形數組“的問題,

當然,這個題要求的是最大串的長度,最大就是n,所以可以這樣求。

這個做法就好像是做了一條”輔助線“

代碼是控制循環次數,在a【】上跑了2遍,

數組中的每一個元素與前一個相比,只要符合增加1的條件,長度就l++;一旦不符合了,馬上記錄l並與前一次l比較,大的留下,小的被覆蓋

l變成1,準備下一次的計數,最後最大的l就留下來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章