1845D - Rating System

Problem - 1845D - Codeforces

Rating System - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意可以去洛谷看一下。

没带苏菲狗,鼠标手画。属实抱歉

我们可以看到这个最后的等级是这样计算的,直到它第一次到k只是一个前缀和,在达到k之后,出现一次<0的连续区间等级就回归k,在某处回到k后,不存在连续区间和小于0时,最后的等级就是k+这一段的和,那么ans =max(k+s),中间若干的<=0的区间可以合并成一个大的<=0的区间,那么ans=max(sum(1,n)-sum(l,r)),sum(1,n)是定值,我们只要让sum(l,r)尽量小即可。此时的答案就是l

代码

#include<iostream>
#include<cstring>
#define int long long
using namespace std;
int n,x;

void solve()
{
	cin>>n;
	int sum=0,tmp=0,ans=0,qwe=0;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		sum+=x;
		tmp=max(tmp,sum);//找此时最大的前缀和 
		if(sum-tmp<qwe)//那么在(1,i)区间里此时的(l,i)更小那么更新答案 
		{
			qwe=sum-tmp;
			ans=tmp;
		}	
	}
	cout<<ans<<endl;
}
signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}
posted @ 2023-07-11 20:34  qbning  阅读(30)  评论(0编辑  收藏  举报
描述