HDU1009——FatMouse'Trade

本文介绍了一个ACM竞赛中的经典问题——猫粮交换问题。通过C语言实现,使用结构体存储每种猫粮的交换比例,并通过qsort进行排序以找出最优交换方案。

 

#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
struct goods{
    int sum;
    int sum2;
    double piece;
}p[MAX];

int cmp(const void *a,const void *b){
    struct goods *aa=(struct goods *)a;
    struct goods *bb=(struct goods *)b;
    if(aa->piece>bb->piece){
        return -1;
    }else{
        return 1;
    }
}

int main(int argc, const char * argv[]) {
    int m,n;
    while(scanf("%d %d",&m,&n)&&m>=0&&n>=0){
        int i=0;
        double maxsum=0;
        int sum,sum2;
        for(i=0;i<n;i++){
            scanf("%d %d",&sum,&sum2);
            p[i].sum=sum;
            p[i].sum2=sum2;
            p[i].piece=sum*1.0/sum2;
        }
        qsort(p,n,sizeof(p[0]),cmp);//价格降序排列;
        /*for(i=0;i<n;i++){
            printf("%d %d\n",p[i].sum,p[i].piece);
        }*/
        for(i=0;i<n;i++){
            if((m-p[i].sum2)>0){
                m-=p[i].sum2;
                maxsum+=p[i].sum;
            }else{
                maxsum+=(m*p[i].piece);
                m=0;
            }
            if(m<=0){
                break;
            }
        }
        printf("%.3lf\n",maxsum);
    }
    return 0;
}

现在acm流行考英语么?让我读题读了半天。

总的来说,老鼠总共有n袋猫粮,可以换吃的。总共有n个房间,每个房间有若干袋猫粮与吃的,可以等比锐换。求老鼠最多能换到多少吃的。

题目很简单,但要注意要考虑如果钱多于商品总量的情况。

思维一定要严密!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值