2023.12.2 cf 1903C
解题思路(听说是个常见的形式)
a:第一个部分 b:第二个部分 c:第三个部分
本题1*a+2*b+3*c......这种形式可以拆成
a+b+c+......
加上
b+c+......
加上
c+......
由以上看出可以构造后缀和
再证明贪心:
当a*n+b*(n+1)>(a+b)*n,解得b>0,也就是说,当加上的后缀大于0时做切割能得到较大结果
ps:其实一开始想到贪心是后面的数大于0就切割的,但没想到后缀和所以后面的数又会被它后面的数影响,一直没想到解法
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int N=100005;
int a[N];
ll suf[N];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
suf[n+1]=0;
for(int i=n;i>0;i--)suf[i]=suf[i+1]+a[i];
ll ans=suf[1];
for(int i=2;i<=n;i++)
{
if(suf[i]>0)ans+=suf[i];
}
cout<<ans<<endl;
}
return 0;
}
标签:suf,后缀,ll,int,+......,刷题,贪心
From: https://www.cnblogs.com/modemingzi-csy/p/17872339.html