刷题 后缀和 贪心

发布时间 2023-12-02 22:08:20作者: modemingzi

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