卧薪尝胆,厚积薄发。
可持久化动态图上树状数组维护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
ღゝ◡╹)ノ♡