刷题 后缀和 贪心
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;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号