牛客练习赛29-A-可持久化动态图上树状数组维护01背包(贪心)

题目链接:https://www.nowcoder.com/acm/contest/211/A

题目描述 

你有一个长度为 n 序列 {a}(序列下标从1开始) ,每次可以从任意位置 i 花费 ai*i 的代价来把 ai 删除。

注意,删除后 ai 后面的数会依次向前补上(下标 -1 ) 。

求把整个序列删完的最小代价。

输入描述:

第一行一个整数 n ,第二行 n 个整数代表该序列。

输出描述:

一行一个整数表示删完序列的最小代价。

示例1

输入

复制

2
3 2

输出

复制

5

备注:

1<=n<=106,|ai|<=107

保证答案在 (-264,264) 范围内

思路:删除数的时候,先删除负数,为保证ans尽可能的小,删负数的时候肯定是从右往左删除,我们发现此时负数刚好是ai * i

删完负数,正数从左往右删除即可,这样下标一直是1。

AC代码:

#include 
#define ll long long
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    ll ans=0,x;
    for(int i = 1; i <= n; i++)
    {
        scanf("%lld",&x);
        ans += x < 0 ? x * i : x;
    }
    printf("%lld\n",ans);
}

 

你可能感兴趣的:(牛客练习赛29-A-可持久化动态图上树状数组维护01背包(贪心))