题目描述:
兴中道是中山最美丽的道路,路中间的绿化带上种了两列漂亮的大树,这些大树分成了50行,每行两棵大树,一共100棵大树,这些大树被编上了号,编号方式如下:
1 3 5 7 ………… 45 47 49
2 4 6 8 ………… 46 48 50
再过几天奥运火炬就要在中山传递了,美丽的兴中道当然是最重要的必经之路,但是某天晚上却发生了一件令人震惊的大事--可恶的破坏分子为了破坏奥运,让中山人民丢丑,竟然偷去了这100棵大树中的一部分!
公安部门马上出动,列出了被偷去了大树的编号。现在摆在我们面前的情况是,如果火炬的旁边是空空的树坑,那是令人无法接受的,因此我们只能压缩火炬在兴中道上的传递距离,务必使火炬在连续的大树边传递,当时,我们就得找出一列最长的连续的大树供传递火炬时展现在全世界的人面前。请你编写程序解决这一难题。
题目大意:
求一段不连续的序列中的最长连续子序列长度和初始位置
输入格式:
N (表示有N棵大树被盗)
N1 N2 N3……NN (被盗大树的编号)
输出格式:
M X(表示从第M棵大树开始,共有连续的X棵大树)
输入样例:
5 9 15 27 35 6
输出样例:
8 47
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[55];
int b[55];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (x % 2 == 0)a[x / 2] = 1;
else b[(x + 1) / 2] = 1;
}
int i, j;
int maxa=-10, maxb=-10;
int cnta = 0, cntb = 0;
int sta = 1, stb = 1;
j = 0;
for (i = 1; i <= 50; i++)
{
if (a[i] == 0)cnta++;
else cnta = 0, j = i;
if (cnta > maxa)maxa = cnta, sta = j + 1;
}
j = 0;
for (i = 1; i <= 50; i++)
{
if (b[i] == 0)cntb++;
else cntb = 0, j = i;
if (cntb > maxb)maxb = cntb, stb = j + 1;
}
if (maxa > maxb)cout << 2 * sta << " " << maxa;
else cout << 2 * stb - 1 << " " << maxb;
return 0;
}