杭电1070--喝牛奶

牛奶

问题描述
伊格内修斯每天喝牛奶,现在他在超市里,他想选择一瓶牛奶。在超市有许多种类的牛奶,所以伊格内修斯想知道哪种牛奶是最便宜的。

这里有一些规则:
1。伊格内修斯永远不会喝牛奶生产6天前或更早。这意味着如果牛奶生产2005-1-1,伊格内修斯永远不会喝这瓶后2005-1-6(包容)。
2。伊格内修斯每天喝200毫升牛奶。
3所示。如果牛奶瓶子里剩下不到200毫升,伊格内修斯会扔掉它。
4所示。超市里所有的牛奶是今天生产。

注意,伊格内修斯只是想买一瓶牛奶,所以如果一个瓶子的体积数小于200毫升,你应该忽略它。
鉴于一些信息的牛奶,你的任务就是告诉伊格内修斯这牛奶是最便宜的。

输入
输入包含多个测试用例。输入的第一行是一个整数T测试用例的数量。T测试用例。
每个测试用例开始于一个整数N(1 < = N < = 100)的数量种类的牛奶。N行,每一行包含一个字符串S(长度将最多100个字符)标明品牌的牛奶,然后两个整数的品牌:P(元),这是一瓶的价格,V(mL),这是一个瓶子的体积。

输出
为每个测试用例,你应该输出品牌的牛奶是最便宜的。如果有超过一个便宜的品牌,你应该输出的最大体积。

样例输入
2
2
Yili 10 500
Mengniu 20 1000
4
Yili 10 500
Mengniu 20 1000
Guangming 1 199
Yanpai 40 10000

样例输出
Mengniu
Mengniu

题意:
1。伊格内修斯永远不会喝牛奶生产6天前或更早。这意味着如果牛奶生产2005-1-1,伊格内修斯永远不会喝这瓶后2005-1-6(包容)。
2。伊格内修斯每天喝200毫升牛奶。
3所示。如果牛奶瓶子里剩下不到200毫升,伊格内修斯会扔掉它。
4所示。超市里所有的牛奶是今天生产。
注意,伊格内修斯只是想买一瓶牛奶,所以如果一个瓶子的体积数小于200毫升,你应该忽略它。(不处理)

思路:
根据每天的平均消费最少的进行选择(价钱/),>=6天的认为只要5天

代码:

# include <iostream>
# include <cstdio>

using namespace std;


int main(){

    char st[103][103];
    int a[103],b[103],c[103];
    float v[103]; 
    int i,j,k,n,m;

    while(scanf("%d",&n)!=EOF){

        for(i=0;i<n;i++){
            scanf("%d",&m);
            for(j=0;j<m;j++) 
                scanf("%s%d%d",st[j],&a[j],&b[j]);

            for(j=0;j<m;j++)//计算能喝几天 
                if(b[j]<200){
                    c[j] = 0;
                }else{
                    c[j] = b[j]/200;
                    if(c[j]>=6){
                        c[j] = 5;
                    }
                }

            for(j=0;j<m;j++){
                if(c[j]==0){
                    v[j]=0;
                    continue;
                }else
                    v[j] = 1.0*a[j]/c[j];
            } 

            int at=0,bt=0,ct=0,cnt=0;
            float max = 9999999;
              for(j=0;j<m;j++){
                   if(v[j]<=max&&b[j]>=200){
                       if(v[j]==max){
                           if(b[j]>b[cnt]) 
                               cnt = j;
                       }else{
                           max = v[j];
                           cnt = j;
                       }


                   }
            } 


             /* 
             按天数计算的
            for(j=0;j<m;j++){
                if(c[j]>max){
                    max = c[j];
                    cnt = j;
                }else if(c[j]==max){
                    if(v[j]<v[cnt]){
                        max = c[j];
                        cnt = j;
                    }else if(v[j]==v[cnt]){
                        if(b[j]>b[cnt]){
                            max = c[j];
                            cnt = j;
                        }
                    } 

                }
            }
            */

            printf("%s\n",st[cnt]);

        }


    }



    return 0;
}

代码2:

# include <iostream>
# include <cstdio>

using namespace std;

struct Milk{

    char name[100];
    int price;
    int v;//体积
    int day; //可以喝几天 
    int avg; //平均价钱 

};

int main(){

    int T,n,m,i,j,k;
    Milk milks[103];


    while(scanf("%d",&T)!=EOF){
        while(T--){


        scanf("%d",&n);
        float max = 9999999;
        int cnt = 0;
        for(i=0;i<n;i++){
            scanf("%s%d%d",milks[i].name,&milks[i].price,&milks[i].v);

            if(milks[i].v<200){
                continue;
            }else{

                milks[i].day = milks[i].v/200;
                if(milks[i].day>=6){
                    milks[i].day = 5;
                }
                milks[i].avg = milks[i].price/milks[i].day;

                if(milks[i].avg<=max){
                    if(milks[i].avg<max){
                        max = milks[i].avg;
                        cnt = i;
                    }else if(milks[i].avg==max){
                        if(milks[i].v>milks[cnt].v){
                            cnt = i;
                        }
                    }

                }


            }
        }

        printf("%s\n",milks[cnt].name);

        }   

    } 


    return 0;
}

你可能感兴趣的:(杭电,贪心)