题目描述
小BB同学想去吃自助餐,但是他是那种比较节俭的的人,既不想浪费食物,又想尽可能吃的贵一点,他于是私下里做了调查。
小蓝餐厅的自助餐有 nn 种食材,每种食材都有它的价格。
而且也能估计出每一份的重量,所以他列了一个表格:
菜品 | 价格(元) | 重量(g) |
---|---|---|
红烧牛肉 | 30 | 300 |
油闷大虾 | 8 | 5 |
四喜丸子 | 4 | 8 |
三文鱼 | 5 | 3 |
排骨 | 18 | 200 |
麻辣兔头 | 20 | 120 |
高汤海参 | 40 | 70 |
扇贝粉丝 | 8 | 32 |
牛排 | 79 | 240 |
小BB的饭量为 CC(g),他想知道在不超过饭量的情况下他最多能吃多少钱的菜品。
请你设计一个程序帮助小BB计算他的最多吃了多少钱。(假设自助餐厅的菜品供应同样的菜品每个人只能取一份。)
输入描述
第一行输入两个整数 n,Cn,C(0\leq n\leq 10^30≤n≤103,0\leq C\leq 10^40≤C≤104),其中 nn 为菜品数量,CC 为小BB的肚子容量。
接下来 nn 行每行输入两个数 v[i],w[i]v[i],w[i],v[i]v[i] 是第 ii 个菜品的价值,w[i]w[i] 表示第 ii 个菜品的重量(0\leq v[i],w[i] \leq 10^40≤v[i],w[i]≤104)。
输出描述
输出一行数据,表示最大的价值,保留小数点后三位数。
示例
输入
20 1000
1 22
2 43
123 214
12 2
123 432
21 223
22 16
77 49
34 78
34 9
43 677
21 34
23 23
12 56
332 56
21 99
123 545
389 33
12 999
23 88
输出
1204.114
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路:
- 两种情况:全部吃完;没全部吃完
- 优先吃有价值的:用结构体实现性价比比较,排序
CODE:
初始化:
结构体跟比较规则
struct food{
double v;
double w;
double aver;
};
int cmp(food a,food b){
return a.aver>b.aver;
}
初始化food结构体数组,输入食物n,肚子容量c
Food foods[1000];//取决于n的上限
int n,c;
double value;
输入数据 (main函数里)同时完成性价比计算
cin>>n>>c;
for(int i=0;i<n;i++){
cin>>foods[i].v>>foods[i].w;
foods[i].aver=food[i].v/food[i].w;
}
用sort函数,cmp规则性价比大到小排序
sort(foods,foods+n,cmp);
是否吃完:
通过计算重量w的和,与胃容量c比较
for(int i=0;i<n;i++){
//容量还够,累加value,让容量减小foods[i].w
if(foods[i].w<=c){
value+=foods[i].v;
c-=foods[i].w;
}
//容量不够,按aver比值*剩余容量c加进value,同时c清零,表示没有剩余容量
else{
value+=c*foods[i].aver;
c=0;
}
if(!c)
break;
}
//输出
printf("%.3f",value);