比赛 20160412 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 非负的部分和 最终得分 100
用户昵称 Fmuckss 运行时间 0.608 s
代码语言 C++ 内存使用 15.57 MiB
提交时间 2016-04-12 10:55:46
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e6+10;
int n;
struct node {
	int c;
	int la, ne;
	bool ex;
}ns[maxn];

int tot;

void read() {
	scanf("%d", &n);
	tot = n;
	for(int i = 1; i <= n; i++) {
		scanf("%d", &ns[i].c);
		ns[i].la = i-1;
		ns[i].ne = i+1;
		ns[i].ex = true;
	}
	ns[1].la = n;
	ns[n].ne = 1;
}
void out() {
	for(int i = 1; i <= n; i++) {
		if(ns[i].ex) {
			printf("%d ", ns[i].c);
		}
	} 
	printf("\n");
}
void merge(int now) {
	for(int i = ns[now].la; i != now; i = ns[i].la) {
		if(ns[now].c + ns[i].c < 0) {
			ns[i].ex = false;
			ns[now].c += ns[i].c;
			ns[ns[i].la].ne = now;
			ns[now].la = ns[i].la;
			tot--;
		} else {
			ns[i].ex = false;
			ns[now].c += ns[i].c;
			ns[ns[i].la].ne = now;
			ns[now].la = ns[i].la;
			tot--;
			break;
		}
	}
}
void solve() {
	int now = 1; 
	while(true) {
		bool b = false;
		int cnt = 0;
		for(;;now = ns[now].ne) {
			cnt++;
			if(ns[now].c < 0) {
				merge(now);
				if(tot == 1) b = true;//全是负的了... 
//				out();
				break;
			}
			if(cnt == tot) {//没有负的了 
				b = true;
				break;
			}
		}
		if(b) break;
	}
	int cnt = 0;
	for(int i = 1; i <= n; i++) {
		if(ns[i].ex && ns[i].c >= 0) cnt++;
	}
	printf("%d", cnt);
}
int main() {
	freopen("sumc.in", "r", stdin);
	freopen("sumc.out", "w", stdout);
	read();
	solve();
	return 0;
}