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

hdu 5783 Divide the Sequence【水题】

2016-08-02 18:52 393 查看

Divide the Sequence

Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 126    Accepted Submission(s): 79


[align=left]Problem Description[/align]
Alice has a sequence A, She wants to split A into as much as possible continuous subsequences, satisfying that for each subsequence, every its prefix sum is not small than 0.
 

[align=left]Input[/align]
The input consists of multiple test cases.

Each test case begin with an integer n in a single line.

The next line contains n
integers A1,A2⋯An.
1≤n≤1e6
−10000≤A[i]≤10000

You can assume that there is at least one solution.
 

[align=left]Output[/align]
For each test case, output an integer indicates the maximum number of sequence division.
 

[align=left]Sample Input[/align]
[align=left]6[/align]
[align=left]1 2 3 4 5 6[/align]
[align=left]4 [/align]
[align=left]1 2 -3 0[/align]
[align=left]5[/align]
[align=left]0 0 0 0 0[/align]
 

[align=left]Sample Output[/align]
[align=left]6[/align]
[align=left]2[/align]
[align=left]5[/align]

[align=left]Author[/align]
ZSTU
[align=left]Source[/align]
2016 Multi-University Training Contest 5 

题目大意:将一个序列拆分成尽可能多的子序列,使得子序列的前缀和全部大于等于0、

思路:

1、正向考虑,找到一个负数之后,从后向前找,直到加和为0为止,这个区间就是一个子序列。如果没有负数,其他的各自成一个序列。可惜会TLE 。因为时间复杂度不定,最不好的情况甚至会达到N^2。

2、那么我们不妨逆向思维来想这个问题,倒着走,如果遇到了一个负数之后,继续向前走,直到加和为0为止,这个区间就是一个子序列,如果没有负数,其他的各自成一个序列。

Ac代码:

#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
ll a[1000500];
ll aa[10005000];
ll sum[1000500];
int main()
{
ll n;
while(~scanf("%I64d",&n))
{
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
}
int output=n;
int tmp=0;
ll summ;
for(int i=n-1;i>=0;i--)
{
if(tmp==0&&a[i]>=0)continue;
if(tmp==0&&a[i]<0)
{
tmp=1;
summ=a[i];
continue;
}
if(tmp==1)
{
summ+=a[i];
output--;
if(summ>=0)
{
tmp=0;
}
}
}
printf("%d\n",output);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 5783 杭电 5783