A - FatMouse' Trade

肥鼠准备了 M 磅的猫粮,准备和看管仓库的猫交易,仓库里装有他最喜爱的食物 Java 豆。

仓库有 N 个房间。第 i 间房包含了 J[i] 磅的 Java 豆,需要 F[i] 磅的猫粮。肥鼠不必为了房间中的所有 Java 豆而交易,相反,他可以支付 F[i] * a% 磅的猫粮去交换得到 J[i] * a% 磅的 Java 豆。这里,a 表示一个实数。

现在他将这项任务分配给了你:请告诉他,能够获得的 Java 豆的最大值是多少。

输入
输入包含多组测试数据。

对于每组测试数据,以包含了两个非负整数 M 和 N 的一行开始。接下来的 N 行,每行相应包含了两个非负整数 J[i] 和 F[i]。

最后一组测试数据是两个 -1。所有的整数均不超过 1000。

输出
对于每组测试数据,在单独的一行中打印一个实数,精确到小数点后 3 位数,表示肥鼠能够取得的 Java 豆的最大值。

示例输入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1

示例输出
13.333
31.500

分析:

这是典型的贪心问题,我们可以先求出每个房间内的Java 豆“性价比”,然后按照性价比进行排序。依次从排序后的房间获得Java豆即可我是小白

我不说大家也知道

小白必须要比别人更加努力。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#define ll long long
using namespace std;
struct mouse{
    int j,f;
    double ans;//结构体存储数据,ans求得每个房间的性价比
}mou[1010];
int a,b,c,d;
double sum;
bool cmp(mouse a,mouse b){
    return a.ans>b.ans;
}
int main(){
    while(scanf("%d%d",&a,&b)!=EOF&&((a!=-1)||(b!=-1))){
        memset(mou,0,sizeof(mouse));
        for(int i=0;i<b;i++){
            scanf("%d%d",&mou[i].j,&mou[i].f);
            mou[i].ans=1.0*mou[i].j/mou[i].f;//求得性价比
        }
        sort(mou,mou+b,cmp);//对性价比排序
        sum=c=0;
        for(int i=0;i<b;i++){
            if(c<=a){
                if(c+mou[i].f<=a){
                    sum+=mou[i].j;
                    c+=mou[i].f;
                }
                else{
                    sum+=mou[i].ans*(a-c);
                    c=a;
                }
            }
            else break;
        }
        printf("%.3lf\n",sum);
    }
    return 0;
}

熟悉新编辑器的语法

扫描二维码关注公众号,回复: 2786591 查看本文章

猜你喜欢

转载自blog.csdn.net/liubang00001/article/details/81506269
今日推荐