来个板烧鸡腿堡吧!

题目描述

众所周知,金拱门最好吃的汉堡就是板烧鸡腿堡。当然XP也是这么觉得的。

某个周末,XP到了一条金拱门街游玩,这条街上有n家金拱门的店铺,每个店铺都有一定的板烧鸡腿堡储量ai。现在,为了快乐,XP想在这条街道上买尽可能多的板烧鸡腿堡。但是,与此同时,出于某种汉堡哲学,当XP在第j个店铺买了xj个板烧鸡腿堡之后,必须保证在所有满足i>j的第i家店铺中都需要购买并且所买的板烧鸡腿堡的数量xi都大于xj 。

现在,XP给了你这些店铺的数量,和他们的板烧鸡腿堡储量,你可以帮他算出,他最多可以买多少的板烧鸡腿堡嘛?

输入

第一行给出一个整数n (1≤n≤2*105) ,代表这条街上的金拱门的数量 。
第二行给出n个整数 ai(1≤ai≤109) ,代表第i家金拱门店铺的板烧鸡腿堡储量 。

输出

输出XP所能买的最多的板烧鸡腿堡的数量。

样例输入

5

1 2 1 3 6

样例输出

10

思路

因为在一个店铺里买了鸡腿堡,那么后面的店铺都要买,而且后面买的要比前面的多

从后往前遍历,贪心取最大值

AC代码

#include <iostream>
#include <stdio.h>
#include <queue>
#include <set>
#include <string>
#include <map>
#include <cmath>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
const int maxn = 2e5 + 5;
const int inf = 0x3f3f3f3f;
ll a[maxn];
int main()
{
    int n;
    while (~scanf("%d", &n))
    {
        for (int i = 1; i <= n; ++i)
            scanf("%lld", &a[i]);
        ll ans = a[n], now = a[n];
        for (int i = n - 1; i >= 1; --i)
        {
            now = min(now - 1, a[i]);
            if (now > 0)
                ans += now;
        }
        printf("%lld\n", ans);
    }
    return 0;
}
发布了145 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43984169/article/details/102545879