1 2 3 4

Yet Another Yet Another Task

https://codeforc.es/contest/1359/problem/D

 

参考了一位大佬   https://www.cnblogs.com/stelayuri/p/12986700.html

看完题解我是震惊的。

枚举最大值,如果前面区间sum小于0,就直接扔掉(sum = 0),因为留下它也是拖后腿,遇到 list[i] > mx,就重新计算区间,sum = 0.

非常巧妙,LDK都说作者好聪明呀

#include<iostream>
#include<set>
using namespace std;
const int maxn = 1e5+11;
int list[maxn];
int cns[maxn];

set<int,greater<int> >ins;
set<int>::iterator it;

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>list[i];
	}
	int ans = 0;
	int sum = 0;
	for(int i=0;i<=30;i++){
		sum = 0;
		for(int j=1;j<=n;j++){
			
			if(list[j] > i){
				sum = 0;
				continue;
			}
			sum += list[j];
			
			if(sum<0) sum = 0;
			
			ans = max(ans,sum - i);
		}
	}	
	cout<<ans<<endl;
	return 0;
}

  

posted @ 2020-05-29 17:34  Lesning  阅读(141)  评论(0编辑  收藏  举报