题目链接:点击打开链接
题目大意:有 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; }