【HDU】1070 Milk

问题描述
伊格内修斯每天都喝牛奶,现在他在超市里,他想要选择一瓶牛奶。超市里有很多种牛奶,所以依纳爵想知道哪种牛奶是最便宜的。
这里有一些规则:
1.依纳爵不会喝6天前或更早产的牛奶。这意味着如果牛奶是2005-1-1生产的,那么在2005-1-6(含)之后,Ignatius将永远不喝这瓶。
伊格内修斯每天喝200毫升牛奶。
3.如果瓶中的牛奶少于200mL,Ignatius会将其扔掉。
4.超市里的所有牛奶都是今天生产的。
请注意,Ignatius只想购买一瓶牛奶,所以如果瓶子的体积小于200mL,则应该忽略它。
考虑到牛奶的一些信息,你的任务是告诉伊格内修斯哪种牛奶最便宜。
输入
输入包含多个测试用例。输入的第一行是单个整数T,它是测试用例的数量。T测试用例如下。
每个测试用例都以一个整数N(1 <= N <= 100)开始,该整数是牛奶的种类数。然后N行,每行包含一个字符串S(长度至多100个字符),表示牛奶的品牌,然后是品牌的两个整数:P(元),它是瓶子的价格,V(mL)这是一瓶的容量

输出
对于每个测试案例,您应该输出最便宜的牛奶品牌。如果有多个最便宜的品牌,则应输出量最大的品牌。

示例输入
 
 
2 2 伊利10 500 蒙牛20 1000 4 伊利10 500 蒙牛20 1000 光明1 199 盐牌40万

示例输出
 
 
蒙牛 蒙牛
暗示
第一种情况下,伊利牛奶可以喝2天,费用10元。蒙牛牛奶可以喝5天,价格20元。所以蒙牛是最便宜的。第二种情况, 应该忽视牛奶光明。牛奶燕牌可以喝5天,但它的成本40元。所以蒙牛是最便宜的。

虽然这道题是一道水题,但是我觉得它对于初学者考察的点还是很好的,涉及了结构体、结构体排序、排序多种条件等等。

在这里,我使用的方法应该是比较简单易懂的,网上还有一些其他的方法,主要是sort函数在结构体排序中的使用,有的还涉及指针,由于本人学识尚浅,这次的代码没有用这两种方法,以后会补上的~

下面看代码吧:

#include <stdio.h>
struct  Milk{   
    char name[110];
    int p;
    int v;
    int per;
};                //定义结构体变量Milk

int main()
{
    Milk a[100];
    int N,i,n,k;
    double min;
    scanf("%d",&N);
    while(N--)
    {
        scanf("%d",&n);
        for (i=0; i<n; i++)           //每个品牌牛奶的平均价格,也就是性价比,之后选择最佳方案的依据
        {
            scanf("%s %d %d",a[i].name,&a[i].p,&a[i].v);
            if(a[i].v>=1000)
                a[i].per=a[i].p*1.0/5;
            else if(a[i].v<200)
                a[i].per=0;
            else
                a[i].per=a[i].p*1.0/(a[i].v/200);
        }
        min=1000000;
        for (i=0; i<n; i++)                    //在这里,不是真正意义上的排序,知识选出最少的平均价格
        {
            if(a[i].per<min&&a[i].per!=0)
            {
                min=a[i].per;
                k=i;
            }
        }
        for (i=0; i<n; i++)                    //这里是一开始两遍没有AC的原因,要注意题目中提到了如果价格一样,要输出量大的品牌
        {
            if(a[i].per==a[k].per)
            {
                if(a[i].v>a[k].v)
                    k=i;
            }
        }
        printf("%s\n",a[k].name);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值