您的位置:首页 > 其它

ACM坑爹的黑店

2014-08-07 23:58 183 查看
今晚刷了一道题目,想了很久只想到穷举法……看了一下管理员的算法……累觉不爱

题目描述

今天小明去了一个风景如画的地方散心,但是自己带的饮料喝完了,小明口渴难耐,见不远处有家小商店,于是跑去买饮料。

小明:“我要买饮料!”

店主:“我们这里有三种饮料,矿泉水1.5元一瓶,可乐2元一瓶,橙汁3.5元一瓶。”

小明:“好的,给我一瓶矿泉水。”

说完他掏出一张N元的大钞递给店主。

店主:“我忘了提醒你了,我们这里没有找客人钱的习惯的,多的钱我们都当小费收了的,嘿嘿。”

小明:“......”

小明环顾四周,就这一家商店,况且实在太渴了,就决定在这买了。不过小明想,与其把钱当小费送给他还不如自己多买一点饮料,反正早晚都要喝,但是要尽量少让他赚小费。

现在小明希望你能帮他计算一下,最少他要给店主多少小费。

输入格式

输入数据的第一行是一个整数T(1<=T<=100),代表测试数据的数量。然后是T行测试数据,每个测试数据只包含一个正整数N(1<=N<=10000),N代表小明手中钞票的面值,以分为单位。

注意:商店里只有题中描述的三种饮料。

输出

对于每组测试数据,请你输出小明最少要浪费多少钱给店主作为小费,以分为单位。

样例输入

2

900

250

样例输出

0

50

源码:(源码来自http://bbs.acmclub.com/thread-31-1-1.html

#include<stdio.h>

int main()

{

int t,n;

scanf("%d",&t);

while(t--)

{

scanf("%d",&n);

if(n<150)

printf("%d\n",n);

else if(n<=200||n>=300)

printf("%d\n",n%50);

else

printf("%d\n",n-200);

}

return 0;

}

看了他的代码,总结了一下,不对的地方请多多指教

先一句话概括:

说白了题目的意思就是让你拿 1.5 2 3.5 这三个数字来组合,看你能组成多少种不大于100的结果,

然后看从1毛钱到100块钱之间,有哪些数字是你组合不出来的分区间,

0 - 150:这个你肯定明白

150 - 200:结果应该是n%150;

200 - 350: 结果貌似应该是n-200;

但是 有没有发现,如果n超过了300,我就可以换成两个150,

所以

200 - 300 :结果是n-200;

300 - 350 :肯定是转换成两个150不用浪费那么多钱,

然后就到了

350 - 10000:

如果在350到400,没得选,肯定是买350的,但是如果到了400,就可以换其他了

也就是说,从350开始,n每多了50,我就可以通过转换成其他的,浪费的钱不会超过50,

同时,150到200,300到350,浪费的钱也不会超过50,所以几种情况可以总在一起

实在是佩服……没见过的话,真的不知有这么好用的算法


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: