杭电ACM1009

FatMouse ' Trade

题目:

老鼠和猫交换事物的问题。老鼠有M磅的catfood,想要换取javabean;猫有N间仓库,第i间仓库里有J[I]的javabean,需要以F[i]的catfood换取(如果不能全部换取,那么可以按比例换取)。求Fatmouse可以最多换取多少的javabean。


分析:

贪心算法:以javabean/catfood的值做判断依据,比例越高,就优先换取。

1.定义结构体。cat的仓库,有javabean,需要catfood,以及pro(比值)。

2.需要按照比值进行排序。可以使用各种排序方法进行排序(快速排序,插入排序等等),也可以用自带的sort函数进行排序,但是需要注意的是sort(begin,end)是升序排列,题目所需是降序,所以可以用sort(begin,end,compare)进行降序排列,其中bool compare()中需要申明是以比例的降序(即 return r1.pro>r2.pro),然后把返回值作为sort的参数,当然也可以直接用sort(begin,end),然后在换取的时候从后面换取。

3.结果输出3位小数。c++中可以使用cout<<fixed<<setprecision(3)<<sum<<endl;c中可以用.3f。

4.sort ————#include<algorithm>

   cout<<fixed<<setprecision(3)<<sum<<endl;————#include<iomanip>   

   printf("%.3f\n",sum); ————#include<stdio.h>


代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>   
using namespace std;
struct room{    //房间的结构体
    int javabean;
    int catfood;
    double pro; //javabean与catfood的比值
};


bool compare(struct room r1,struct room r2){    //按照pro即比例的降序排列
    return r1.pro>r2.pro;
}


int main(){
    int m,n;
    double sum;
    struct room r[1001];
    while(cin>>m>>n && m!=-1 && n!=-1){ //输入的m,n只要不是-1就继续执行
            sum=0;
        for(int i=0;i<n;i++){
            cin>>r[i].javabean>>r[i].catfood;
            if(r[i].catfood==0)  r[i].pro=10000;    //如果房间不需要catfood换取javabean,那么使其比例为10000.
            else                          //否则比例是javabean/catfood
                r[i].pro=1.0*r[i].javabean/r[i].catfood;
        }
        sort(r,r+n,compare);   //把房间按照pro的大小排序


        for(int j=0;j<n;j++){
            if(m>r[j].catfood){     //如果fatmouse有的catfood大于所需要,那么就可以兑换
                sum+=r[j].javabean;
                m-=r[j].catfood;
            }
            else{       //否则,则按比例换取
                sum+=m*(1.0*r[j].javabean/r[j].catfood);
                break;
            }
        }
        cout<<fixed<<setprecision(3)<<sum<<endl;
        //printf("%.3f\n",sum);   //保留三位小数

    }

 return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值