题意:
有几种月饼,每种数量不一样,每种总价不一样,现在有市场需求d,求最大的获利,每种可以取一部分。
解法:
求出平均单价,按单价从大到小排序,然后判断数量是否小于剩余市场所需,是取所有数量,不是取部分,直到剩余市场所需为0。
总结:
这一题刚开始没理解,后来看懂了,很快写出来了,但是第三个点通不过,试了好几次都没成功,看一下别人讲解才发现数量应该取double类型,仔细看看题目也没有明确说是哪种类型。
(用时:55.39.47)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<cstring>
#include<cmath>
//#include<bits/stdc++.h>
using namespace std;
struct Node {
double price;
int alltones;
double avgprice;
};
bool cmp(Node a,Node b)
{
return a.avgprice>b.avgprice;
}
int main()
{
int n;
int d;
scanf("%d%d",&n,&d);
Node node[n];
for(int i=0; i<n; i++) {
scanf("%d",&node[i].alltones);
}
for(int i=0; i<n; i++) {
scanf("%lf",&node[i].price);
node[i].avgprice = node[i].price / node[i].alltones;
}
sort(node,node+n,cmp);
double profit=0;
int sum = d;
for(int i=0; i<n; i++) {
if(node[i].alltones<=sum) {
sum -= node[i].alltones;
profit += node[i].price;
} else {
profit += sum * node[i].price / node[i].alltones;
break;
}
}
printf("%.2lf\n",profit);
return 0;
}