题目描述
今天小明去了一个风景如画的地方散心,但是自己带的饮料喝完了,小明口渴难耐,见不远处有家小商店,于是跑去买饮料。
小明:“我要买饮料!”
店主:“我们这里有三种饮料,矿泉水1.5元一瓶,可乐2元一瓶,橙汁3.5元一瓶。”
小明:“好的,给我一瓶矿泉水。”
说完他掏出一张N元的大钞递给店主。
店主:“我忘了提醒你了,我们这里没有找客人钱的习惯的,多的钱我们都当小费收了的,嘿嘿。”
小明:“......”
小明环顾四周,就这一家商店,况且实在太渴了,就决定在这买了。不过小明想,与其把钱当小费送给他还不如自己多买一点饮料,反正早晚都要喝,但是要尽量少让他赚小费。
现在小明希望你能帮他计算一下,最少他要给店主多少小费。
输入
输入数据的第一行是一个整数T(1<=T<=100),代表测试数据的数量。然后是T行测试数据,每个测试数据只包含一个正整数N(1<=N<=10000),N代表小明手中钞票的面值,以分为单位。
注意:商店里只有题中描述的三种饮料。
输出
对于每组测试数据,请你输出小明最少要浪费多少钱给店主作为小费,以分为单位。
样例输入 Copy
2 900 250
样例输出 Copy
0 50
思路分析: 一共有 1.5 2 3.5元的
思路一:
总花费w = 1.5*i + 2*j + 3.5*k 暴力遍历即可得到最小值
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int counts(int total){
int a = 150, b = 250 ,c = 350;
int result;
int min = total;
for(int i=0;i<=total/150;i++){
for(int j=0;j<=(total-i*150)/200;j++){
for(int k=0;k<=(total-i*150-j*200)/350;k++){
result = 150*i + 200*j + 350*k;
if(min>total - result) min = total - result;
}
}
}
return min;
}
int main(){
int n;
int total;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&total);
printf("%d\n",counts(total));
}
}
思路二: 我们可以仔细看它的取值,1.5 , 2 , 3.5 用 1.5 / 2 /3.5 的不同组合组合出 4 5 5.5 6 6.5 7 7.5 . . .
由此我们可以得到结论 对于任何面值大于3.5元的钞票 换算成以分为单位是 任意大于350分面值的钞票
其小费都可以用 N%50 来求取
对于小于350的 若大于200 则 N%200
大于150 小于 200 则 N%150
小于150的就 直接全是小费了
这部分代码其实很简单了 读者可以自己理解后实现即可