问题描述
伊格内修斯每天都喝牛奶,现在他在超市里,他想要选择一瓶牛奶。超市里有很多种牛奶,所以依纳爵想知道哪种牛奶是最便宜的。
这里有一些规则:
1.依纳爵不会喝6天前或更早产的牛奶。这意味着如果牛奶是2005-1-1生产的,那么在2005-1-6(含)之后,Ignatius将永远不喝这瓶。
伊格内修斯每天喝200毫升牛奶。
3.如果瓶中的牛奶少于200mL,Ignatius会将其扔掉。
4.超市里的所有牛奶都是今天生产的。
请注意,Ignatius只想购买一瓶牛奶,所以如果瓶子的体积小于200mL,则应该忽略它。
考虑到牛奶的一些信息,你的任务是告诉伊格内修斯哪种牛奶最便宜。
这里有一些规则:
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)这是一瓶的容量
每个测试用例都以一个整数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;
}