华东交大2013“双基”程序设计大赛--1002

来源:互联网 发布:见一落叶而知岁之将暮 编辑:程序博客网 时间:2024/04/30 14:32

Go shopping

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 622   Accepted Submission(s) : 35

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

最近Awell的运气特别好,这不,他在路边摊买彩票,居然中了大奖。秉着见者有份的原则,他准备请咱们学校ACM-ICPC训练基地的全体队员逛商场。

  赶巧交大旁边有一家商场新店开张,正在进行打折促销活动。于是,咱们所有队员都在商场中大肆购买之后,在收银台前排起了长队。

  话说回来,这家商场的打折方式有些奇怪:他们从在收银台前付账的所有n位顾客中,每隔m名顾客便挑选一位顾客享受七五折优惠,其余顾客只能享受九五折。

  为了方便付账,Awell拜托老板将付账者的姓名和付款金额打印出来,作为参考。
  
  你需要注意的是,在收银台前长长的队伍中,有的可不止是ACM队员,同样,还有很多交大的同学慕名前来消费。为了区分他们,我们规定,所有ACM队员必须在姓名前加上前缀“ACM”(不包含双引号,且不存在非ACM队员的同学名字前面出现ACM字样)。

  现在,请机智的你为Awell编写一个小程序,算一算他总共需要花费多少钱呢?

Input

输入数据包含多组,每组第一行有两个整数n,m。分别代表着在收银台前队伍的全部人数,以及商家将会选择每第m位顾客打7.5折。
你可以通过
while(scanf(......)!=EOF)
{
  ……;
}
的形式进行输入。接下来有n行,每行将会输入消费者的姓名(长度不超过20个字符),以及他们各自消费的金额(以“元”位单位,最高可能精确到小数点后两位)。

Output

  每组数据输出一行,每行一个实数,表示Awell总共需要花费多少开销。你应该注意的是,老板只收取“角”作为最小单位,而且他是一个锱铢必较的人,所以,如果你所付金额中存在小于0.1元的部分,那就至少要付0.1元给他(想着即将消瘦的钱包,Awell泪目中......O(∩_∩)O~~)

Sample Input

4 2Newee 123.12ACMAwell 100PRO 345.5Sirius 456.995 2Newee 123.12ACMAwell 100PROPHET 345.5Sirius 456.99ACMProphetK 100

Sample Output

75.0170.0

题解 :

题目的思路很简单,就是通过判断哪个是ACM队员,并且是否享受7.5折优惠,通过累加得到最后的值。值得注意的是:因为输入的小数最多为2位,乘上0.75或0.95,累加之后最多为4位小数,所以只需要在运算结果上加上0.0499即可保证小于0.1的部分可以进位。很多人想了很多种方法解决进位的问题,也不大了解为什么加上0.0499后可以确保小于0.1的部分可以进位。其实这里面隐含了一个平时常用但不被注意的知识点。即:printf("%.1f",result);这里面.1f的功能是输出保留小数点后一位,并且它的输出有四舍五入的功能。换句话说如果1.01则输出1.0;1.06则输出1.1;所以任何小于0.1的部分加上0.0499后都将>=0.05,所以输出时都将进1.符合题目要求。
#include<stdio.h>  int main()  {      int n,m,i;      double sum,s;      char name[21];      while(scanf("%d%d",&n,&m)!=EOF)      {          sum=0;          for(i=1;i<=n;i++)          {              scanf("%s%lf",name,&s);              if(name[0]=='A'&&name[1]=='C'&&name[2]=='M')              {                  if(i%m==0)                      sum+=s*0.75;                  else                      sum+=s*0.95;              }          }          printf("%.1f\n",sum+0.0499);      }      return 0;  }