问题 E: 干饭人
题目描述
当你做完这一道题的时候,期末考试就结束了。
考完了最后一门,你看着卡里还剩的一点钱陷入了沉思:反正今天就放假啦,把饭卡吃完吧!
终于等到了饭点,干饭人干饭时间,第一个冲向食堂;干饭人干饭魂,干饭人吃饭得用盆!
已知食堂里有n份菜,每份菜会给你带来饱腹感为A1、A2……An,
他们的价格是C1、C2……Cn,由于是最后一天,每个菜只有一份了;食堂阿姨手也不抖了,特地允许如果你钱不够打一个菜,可以用刷一定比例的钱买同比例的菜。即如果一个菜4元一份,饱腹感为2,你可以花2元买半份,获得饱腹感+1.
已知你饭卡里的钱数M,求这一顿能够给你带来的最大饱腹感。
输入
多组数据,每组数据的第一行为两个整数M和n ,用空格隔开, -1 -1 为输入结束标记。接下来n行,每行两个整数 表示食堂里n个菜的饱腹感Ai和价格Ci。(所有数据均小于等于1000)
输出
一个保留3位有效数字的数,表示最大饱腹值
样例输入
4 2
4 7
1 3
5 5
4 8
3 8
1 2
2 5
2 4
-1 -1
样例输出
2.286
2.500
这道题目可能一开始你会摸不着头脑,老样子,一开始我依旧带大家来分析样例输入后,样例输出是怎么得到的。
第一组样例输入
第二组样例输入
分析:算出每个菜的单位饱腹感,然后进行排序,最后饭卡里的钱数乘以最大的单位饱腹感即可得到理想的输出。
看上面两个样例是像上面的分析所述,这样计算得到理想输出的。但是仔细想想,这到底对嘛?
其实是有缺陷的,上面两个样例之所以能得到这样的结果是因为最大单位饱腹感所对应的那一种菜的价格都大于你饭卡里的钱数。
第一组样例中,最大单位饱腹感所对应的是第1个菜,该菜的价格为7元,大于你饭卡上的钱数4元;同理,第二组样例中,最大单位饱腹感所对应的是第1个菜(这边默认如果两个菜单位饱腹感相等,则按原来菜的先后顺序进行排序),该菜的价格是8,大于你饭卡上的钱数5。
同时我们也注意到题干中说明今天是最后一天,食堂里面的饭菜都只有一份,所以当你饭卡里面的钱数是大于最大单位饱腹感所对应的那一份菜的价格的时候,就不能简单的用饭卡里面的钱数*最大的单位饱腹感来求得最大饱腹感了,因为菜只有一份。
这时,你应该去单位饱腹感经降序排序后的第2个菜那边按比例去点。
老样子先上代码,然后再慢慢分析!
#include <stdio.h>
#include <stdlib.h>//qsort函数所在的头文件
/*定义一个结构体类型,里面有3个成员。
第一个成员satiety代表该菜的饱腹感,数据类型为整型;
第二个成员price代表该菜的价格,数据类型为整型;
第三个成员average代表该菜的单位饱腹感,数据类型是浮点型,
为了安全起见,不妨定义为double类型。*/
typedef struct{
int satiety;