hdu 5783
Divide the Sequence
题意是说给你一个串,然后问怎样切割这个串使得每个部分的前缀和均为正数,且得到的字串最多的方法,输出最多几个子川。
第一反应..从头遍历到尾,发现一个负数往前找,直到保证前缀和是正数并记录这个位置,为了提高效率当往前找时发现负数就直接跳到刚才记录的位置,这样写非常繁琐,因为情况比较恶心,一直WA...然后看了队友代码恍然大悟,从尾往前遍历只要一次就够了,而且写起来很方便。不过有个恶心的地方就是中间你用一个值看当前是否使前缀和为正数时,这个用来监视的值一定要用long long,因为可能都是很小的负数然后就爆int了,这个地方WA了很久....
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n;
int num[1000005];
long long ans;
int main(void)
{
while (scanf("%d", &n) != EOF)
{
ans = 0;
for (int i = 0; i < n; i++)
scanf("%d", &num[i]);
for (int i = n - 1; i >= 0; i--)
{
if (num[i] < 0)
{
long long tmp = num[i];
for (i--; i >= 0; i--)
{
tmp += num[i];
if (tmp >= 0)
{
ans++;
break;
}
}
}
else ans++;
}
printf("%lld\n", ans);
}
return 0;
}
本文介绍了 HDU5783 DividetheSequence 的解题思路,通过从序列末尾向前遍历的方式,寻找使得前缀和保持正值的最优切割点,最终输出最多能获得的子序列数量。

167

被折叠的 条评论
为什么被折叠?



