1023:坑爹的黑店

题目描述

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

小明:“我要买饮料!”

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

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

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

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

小明:“......”

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

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

输入格式

输入数据的第一行是一个整数T(1<=T<=100),代表测试数据的数量。然后是T行测试数据,每个测试数据只包含一个正整数N(1<=N<=10000),N代表小明手中钞票的面值,以分为单位。
注意:商店里只有题中描述的三种饮料。

输出

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

样例输入

2
900
250

样例输出

0
50

最初想到的算法,妥妥的出错了

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int time;
 5     int money;
 6     int remain;
 7
 8     scanf("%d",&time);
 9     while(time--)
10     {
11         scanf("%d",&money);
12         remain=money%350;
13
14         remain=remain%200;
15
16         remain=remain%150;
17         if(money<150)
18             money=remain;
19         printf("%d\n",remain);
20     }
21     return 0;
22 }

后来发现这种算法并不对,比如450=3*150,而在我的算法中,先用350去减,剩下100。

下面是参考的官方的代码,不太明白。

#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;
}

下面的是从CSDN看到的代码,容易理解。相当于150*x+200*y+350*z的多项式,x,y,z分别从最大值到0不断尝试,以获得最接近money的值。

附上链接:http://blog.csdn.net/u011470356/article/details/9412157

 1 <span style="font-size:18px;">#include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     cin>>n;
 7     int m,i,j,k;
 8
 9     for(m=0;m<n;m++)
10     {
11         int max=0;
12         int s;
13         cin>>s;
14         for(i=s/350;i>=0;i--)
15         {
16             for(j=(s-i*350)/200;j>=0;j--)
17             {
18                 for(k=(s-i*350-j*200)/150;k>=0;k--)
19                 {
20                     int p=i*350+j*200+k*150;
21                     if(p>max)
22                     max=p;
23                 }
24             }
25
26         }
27         cout<<s-max<<endl;
28
29
30     }
31     return 0;
32 }</span>
时间: 2024-11-04 20:23:37

1023:坑爹的黑店的相关文章

【TK】1023: 坑爹的黑店

1023: 坑爹的黑店 时间限制: 1 Sec  内存限制: 32 MB提交: 2134  解决: 855[提交][状态][下载(1元)] 题目描述 今天小明去了一个风景如画的地方散心,但是自己带的饮料喝完了,小明口渴难耐,见不远处有家小商店,于是跑去买饮料. 小明:"我要买饮料!" 店主:"我们这里有三种饮料,矿泉水1.5元一瓶,可乐2元一瓶,橙汁3.5元一瓶." 小明:"好的,给我一瓶矿泉水." 说完他掏出一张N元的大钞递给店主. 店主:&q

坑爹的黑店

坑爹的黑店 maxm=10000 v=[150,200,350] t=int(raw_input()) for ii in range(0,t): m=int(raw_input()) f=[] for j in range(0,m+1): f.append(m) for i in range(0,3): for j in range(1,m+1): if j>=v[i]: f[j]=min(f[j],f[j-v[i]]-v[i]) print f[m] 完全背包

1025:统计硬币

题目描述 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). 输入格式 输入数据第一行有一个正整数T,表示有T组测试数据.接下来的T行,每行有两个数n,m,n和m的含义同上. 输出 对于每组测试数据,请输出可能的组合方式数,每组输出占一行. 样例输入 23 54 8 样例输出 12 本题的思路类似于鸡兔同笼问题,所以不难想到使用几个for循环对可能值进行穷举,下面是我写的一个算法,在穷举上略有优化. 1 #include <st

app里使用163邮箱发送邮件,被163认为是垃圾邮件的坑爹经历!_ !

最近有个项目,要发邮件给用户设定的邮箱报警,然后就用了163邮箱,代码是网上借来的^^,如下: package com.smartdoorbell.util; import android.os.AsyncTask; import java.util.Date; import java.util.List; import java.util.Properties; import javax.activation.CommandMap; import javax.activation.Mailca

问题 1023: C语言程序设计教程(第三版)课后习题7.2

/******************************************************************** @file Main.cpp @date 2017-05-20 22:05:39 @author Zoro_Tiger @brief 问题 1023: C语言程序设计教程(第三版)课后习题7.2 http://www.dotcpp.com/oj/problem1023.html ****************************************

九度oj 题目1023:EXCEL排序

题目1023:EXCEL排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:20699 解决:4649 题目描述:     Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始).随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序:当 C=2时,按姓名的非递减字典序排序:当 C=3 时,按成绩的非递减排序.当若干学生具有相同姓名或者相同成绩时,则按他们的学号

bzoj 1023: [SHOI2008]cactus仙人掌图 2125: 最短路 4728: 挪威的森林 静态仙人掌上路径长度的维护系列

%%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 1023 求仙人掌直径 树形dp,维护每个点向下的最长和次长路径长度,对原有的点直接更新答案,对新点可以把对应环上的点取出,倍长,破环成链,并用单调队列正反各扫一次 #include<cstdio> char buf[5000000],*ptr=buf-1; int _(){ int x=0,c

hdu 1023 Train Problem II

卡特兰数的应用 :卡特兰数参考kuangbing总结http://www.cnblogs.com/kuangbin/archive/2012/03/21/2410516.html. 大数的运算 hdu题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1023 1 #include<algorithm> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<iostream

1023. 组个最小数

1023. 组个最小数 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558. 现给定数字,请编写程序输出能够组成的最小的数. 输入格式: 每个输入包含1个测试用例.每个测试用例在一行中给出10个非负整数,