ZCMU - 2010: company

xiaoxiao2021-02-28  52

题目链接:点击打开链接

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

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

4-1 -100 5 61 1 1 2arr[i]:   6 6 5 -1 -100cnt[i]:   4 3 2 1sum[i]: 6 12 17 16 -846:1+1+1+16:1+1+15: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; }
转载请注明原文地址: https://www.6miu.com/read-2627778.html

最新回复(0)