ACM坑爹的黑店

今晚刷了一道题目,想了很久只想到穷举法……看了一下管理员的算法……累觉不爱

题目描述

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

小明:“我要买饮料!”

店主:“我们这里有三种饮料,矿泉水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,所以几种情况可以总在一起

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



你可能感兴趣的:(ACM坑爹的黑店)