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;
}