美丽的大树(codevs 2124)
题目描述 Description
平江路是苏州最美丽的道路,路中间的绿化带上种了两行漂亮的大树,每行50棵,一共100棵大树,这些大树被编上了号,编号方式如下:
1 3 5 7 ………… 45 47 49 …………99 第一行
2 4 6 8 ………… 46 48 50 …………100 第二行
但是昨天晚上却发生了一件令人震惊的大事--可恶的破坏分子竟然偷去了这100棵大树中的一部分! 公安部门马上出动,列出了被偷去了大树的编号。现在摆在我们面前的情况是,如果你带领的游客走过的旁边是空空的树坑,那是令人无法接受的,因此我们只能压缩游客在平江路上的旅游距离,务必使游客在连续的大树边游玩,当时,我们就得找出一列(边)最长的连续的大树展现在游客面前。请你编写程序解决这一难题。
输入描述 Input Description
N (表示有N棵大树被盗) N1 N2 N3……NN (被盗大树的编号)
输出描述 Output Description
M X (表示从第M棵大树开始,共有连续的X棵大树,如果有多个解,输出M最小的解即可)
样例输入 Sample Input
5 9 15 27 35 6
样例输出 Sample Output
8 47
数据范围及提示 Data Size & Hint
N<=100
#include<cstdio> #include<iostream> #include<algorithm> #define M 110 using namespace std; int vis[M],flag,cnt; struct node { int len,begin; };node e[M]; int cmp(const node&x,const node&y) { if(x.len>y.len)return 1; if(x.len==y.len&&x.begin<y.begin)return 1; return 0; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); vis[x]=1; } flag=0; for(int i=1;i<=100;i+=2) { if(!flag&&!vis[i]) { flag=1; ++cnt; e[cnt].begin=i; e[cnt].len=1; } else if(flag) { if(!vis[i])e[cnt].len++; else flag=0; } } flag=0; for(int i=2;i<=100;i+=2) { if(!flag&&!vis[i]) { flag=1; ++cnt; e[cnt].begin=i; e[cnt].len=1; } else if(flag) { if(!vis[i])e[cnt].len++; else flag=0; } } sort(e+1,e+cnt+1,cmp); printf("%d %d",e[1].begin,e[1].len); return 0; }