ZCMU - 2010: company

题目链接:点击打开链接


题目大意:有 n 种商品以及这些商品的价值与数量,每天只能购买一件商品,且 ans 为 sum(ti×vali) ,其中 ti 为第几天,求最终所能得到的最大 ans


解题思路:整理好数组并从大到小排序,以及 sum[i] 从 arr[i],[0,k) 开始逐个相加,最后(最关键)只要sum[i]>=0就相加,否则break;此时你肯定会问为什么这样就能保证正确答案?!请看测试用例规律。

4
-1 -100 5 6
1 1 1 2

arr[i]:   6 6 5 -1 -100
cnt[i]:   4 3 2 1
sum[i]: 6 12 17 16 -84

6:1+1+1+1
6:1+1+1
5:1+1
-1:1


AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);

using namespace std;

typedef long long ll;
const int maxn=1e5+100;
ll arr[maxn];
ll sum[maxn];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            int a; scanf("%d",&a);
            arr[i]=a;
        }
        int k=n;
        for(int i=0;i<n;i++)
        {
            int a; scanf("%d",&a);
            for(int j=1;j<a;j++)
                arr[k++]=arr[i];
        }

        sort(arr,arr+k,greater<ll>());

        sum[0]=arr[0];
        for(int i=1;i<k;i++)
            sum[i]=sum[i-1]+arr[i];

        ll ans=0;
        for(int i=0;i<k;i++)
            if(sum[i]>=0) ans+=sum[i];
            else break;

        printf("%lld\n",ans);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/80173849