蓝桥杯「贪心的自助餐」

题目描述

小BB同学想去吃自助餐,但是他是那种比较节俭的的人,既不想浪费食物,又想尽可能吃的贵一点,他于是私下里做了调查。

小蓝餐厅的自助餐有 nn 种食材,每种食材都有它的价格。

而且也能估计出每一份的重量,所以他列了一个表格:

菜品价格(元)重量(g)
红烧牛肉30300
油闷大虾85
四喜丸子48
三文鱼53
排骨18200
麻辣兔头20120
高汤海参4070
扇贝粉丝832
牛排79240

小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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值