uva10026 Shoemaker's Problem

10 篇文章 0 订阅

也是简单题。

用高中老师讲的排序不等式再加上一点贪心的思想就解决了。days/cost最小的shoes应该先做,只有这样才能保证支出最少。。。越来越觉得数学有用啊。。以前感受都不是这么深,做了acm才觉得数学太伟大了。

开始还不太确定这样排序是不是对的,因为我还每想出来怎么证明,但试了下也找不到反例,就先写了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define MAX 1010
using namespace std;

struct element
{
    int index;
    double days,cost,value;
}ele[MAX];

int cmp(const void *p,const void *q)
{
    if(((element *)p)->value>((element *)q)->value)
        return 1;
    else if(((element *)p)->value==((element *)q)->value)
    {
        if(((element *)p)->index<((element *)q)->index)
            return -1;
        else
            return 1;
    }
    else
        return -1;
}

int main()
{
    int t,n,i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%lf %lf",&ele[i].days,&ele[i].cost);
            ele[i].index=i+1;
            ele[i].value=ele[i].days/ele[i].cost;
        }
        qsort(ele,n,sizeof(ele[0]),cmp);
        for(i=0;i<n;i++)
        {
            printf("%d",ele[i].index);
            if(i!=n-1)
                printf(" ");
        }
        puts("");
        if(t)
            puts("");
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值