珠子
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就留下來了。