您的位置:首页 > 其它

HDU-4193 Non-negative Partial Sums

2016-04-28 15:42 302 查看
题意:n个数有多少种移位方式使得从第一个数往后加加到任意位置时和都不小于0,移位就是将第一个数字放到最后一个,1<=n<=1 000 000.

一开始尝试用st表和线段树找区间和得最小值,结果是超内存。这个题没有那个复杂,从第n个数开始往前加,如果加到某个数字和是负数,那么这个数字肯定不能作为第一个数字,如果是正数那么这一段区间的和不会影响前面的区间,可以把和置为0,从前一个数重新开始加,因为是循环移位,最前面数字的加和可能会影响后面的数字,所以扫描两遍数组,最后扫描标记数组,一共有多少个数字可以作为第一个数。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1000000;
int d[MAXN], p[MAXN];
int main() {
int n, i, j;
while(~scanf("%d", &n) && n) {
for(i = 0; i < n; i++)
scanf("%d", &d[i]);
int is = 0, s = 0;
memset(p, -1, sizeof(p));
for(i = n-1; is < 2; i = (i - 1 + n) % n) {
is += !i;
s += d[i];
if(s < 0)
p[i] = 0;
else s = 0;
}
int ans = 0;
for(i = 0; i < n; i++)
ans -= p[i];
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU 4193