卧薪尝胆,厚积薄发。
可持久化动态图上树状数组维护01背包
Date: Sat Oct 20 00:40:45 CST 2018 In Category: NoCategory

Description:

一个长度为 $ n $ 序列 $\{a\}$ (序列下标从 $1$ 开始) ,每次可以从任意位置 $ i $ 花费 $ a_i\times i $ 的代价来把 $ a_i $ 删除。 删除后 $ a_i $ 后面的数会依次向前补上,求把整个序列删完的最小代价。
$1\leqslant n\leqslant 10^6$

Solution:

正数一定尽量放到前面删,负数则尽量向后,于是贪心得整数从第一个开始删,负数从后面删就行了。

Code:


#include<bits/stdc++.h>
using namespace std;
int n;
#define MAXN 1000010
int a[MAXN];
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
long long ans = 0;
for(int i = 1;i <= n;++i)
{
if(a[i] > 0)
{
ans += a[i];
}
else
{
ans += (long long)a[i] * i;
}
}
cout << ans << endl;
return 0;
}
In tag: 算法-贪心
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡