您的位置:首页 > 产品设计 > UI/UE

CSU - 1203 Super-increasing sequence

2016-08-25 15:59 357 查看
题目:

Description如果一个序列中任意一项都大于前面所有项之和,那么我们就称这个序列为超递增序列。现在有一个整数序列,你可以将序列中任意相邻的若干项合并成一项,合并之后这项的值为合并前各项的值之和。通过若干次合并,最终一定能得到一个超递增序列,那么得到的超递增序列最多能有多少项呢?
Input输入数据的第一行包含正整数T (1 <= T <= 500),表示接下来一共有T组测试数据。每组测试数据的第一行包含一个整数N (1 <= N <= 100000),表示这个整数序列一共有N项。接下来一行包含N个不大于10000的正整数,依次描述了这个序列中各项的值。至多有10组数据满足N > 1000。
Output对于每组测试数据,用一行输出一个整数,表示最终得到的超递增序列最多能有多少项。Sample Input
3
2
1 1
3
1 2 4
6
1 2 4 3 6 5
Sample Output
1
3
4


代码:
#include<iostream>
using namespace std;

int main()
{
int T;
cin >> T;
int n;
while (T--)
{
cin >> n;
int *a = new int[n + 1];
int *s = new int[n + 1];
s[0] = 0;
int *f = new int[n + 1];
f[0] = 0;
f[1] = 1;
int c[30]; //c[i]是 使得 f(x)=i的最小x
c[1] = 1;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
s[i] = s[i - 1] + a[i];
if (i > 1)
{
if (s[i] - s[c[f[i - 1]]] - s[c[f[i - 1]]] > 0)
{
f[i] = f[i - 1] + 1;
c[f[i]] = i;
}
else f[i] = f[i - 1];
}
}
cout << f[n] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: