今晚刷了一道题目,想了很久只想到穷举法……看了一下管理员的算法……累觉不爱
今天小明去了一个风景如画的地方散心,但是自己带的饮料喝完了,小明口渴难耐,见不远处有家小商店,于是跑去买饮料。
小明:“我要买饮料!”
店主:“我们这里有三种饮料,矿泉水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
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,所以几种情况可以总在一起
实在是佩服……没见过的话,真的不知有这么好用的算法