题目链接:http://exam.upc.edu.cn/problem.php?id=3400
这个题目真的不错,一开始没理解,后来写一写真的不错。(北邮今年虽然有失误,但是题目出的真不错!!!)
这个题 题意是给定 N个货物的价值, N个货物的数量。
它所求的最大值=(序号×价值)的总和。
我们可以第一时间想到的就是把: 价值大的 ×序号大的 贪心想法。
如示例 -1 -100 5 6
1 1 1 2
答案51
6 6 6 6
6 6 6
5 5
-1
首先第一步就是需要把它离散化然后就需要排序。
如图所示,就好比三角形不断加斜边, 至于怎么加呢,把这个val的种类记录下来,
tmp的值= ans(上一次的)+ tot(种类) + 当前 b[i];
不断更新ans的值,只要ans比之前小了,break;
具体看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct point{
ll x,num;
}p;
int cmp(ll a,ll b){
return a>b;
}
int main()
{
ll n;
scanf("%lld",&n);
p a[1005];
ll cnt=0,sum=0,b[100500];
for(int i=0;i<n;i++){
scanf("%lld",&a[i].x);
}for(int i=0;i<n;i++){
scanf("%lld",&a[i].num);
}
for(int i=0;i<n;i++){
while(a[i].num--){
b[cnt++]=a[i].x;
}
}
sort(b,b+cnt,cmp);
ll tot=0,tmp=0,ans=0;
if(b[0]<=0){
return 0*printf("0\n");
}else{
for(int i=0;i<cnt;i++){
tmp=ans+tot+b[i];
tot+=b[i];
if(tmp<ans){
break;
}
else ans=tmp;
}
}
printf("%lld\n",ans);
return 0;
}