ZOJ 1558 欧元效率
1.问题
2002年1月1日,荷兰和其他几个欧洲国家放弃了本国货币,转而使用欧元。这改变了付款的便利性,而不仅仅是在国际上。
在1月1日之前购买68盾的学生可以用一张50盾的钞票和两张10盾的钞票来支付这本书,从而获得了2盾的兑换。简而言之:50 + 10 + 10-1-1 =68。其他付款方式是:50 + 25-5-1-1或100-25-5-1-1。这两种方式始终有5个单位(钞票或硬币)参与支付过程,并且不能少于5个单位。
如今,购买一本68欧元的书更容易:50 + 20-2 = 68,因此只涉及3个单位。这不是巧合;在许多其他情况下,用欧元付款比用荷兰盾付款更有效。平均而言,欧元更有效率。当然,这与欧元的价值无关,但与选择的单位无关。荷兰盾的单位通常为:1、2.5、5、10、25、50,而欧元的单位为:1、2、5、10、20、50。
对于此问题,我们将自己限制为最多100美分。欧元的硬币面值为1、2、5、10、20、50欧分。在支付[1,100]欧分范围内的任意金额时,平均涉及2.96个硬币,无论是付款还是找零。从这个意义上讲,欧元系列并不是最佳选择。使用硬币1、24、34、39、46、50,可以使用两个硬币支付68美分。支付[1,100]范围内的金额所涉及的平均硬币数量为2.52。
但是,后一个系列的计算更为复杂。也就是说,心理计算。这些计算可以很容易地在如今几乎每个人都随身携带的任何手机中进行编程。为未来做准备,欧洲中央银行委员会正在研究一系列硬币的效率,以找到最有效的系列硬币,最高金额为100欧分。他们需要您的帮助。
编写一个程序,给定一系列硬币,计算出支付不超过100美分的任何金额所需的平均和最大硬币数。您可能会假设双方都拥有足够数量的任何硬币。
2.输入
输入的第一行包含测试用例的数量。每个测试用例在一行上用6个不同的正整数描述:硬币的值,按升序排列。第一个数字始终为1。最后一个数字小于100。
3.输出
对于每个测试用例,输出是一条单行,其中首先包含平均值,然后是涉及支付[1,100]范围内的金额的最大硬币数量。这些值用空格分隔。如示例中所示,平均值应始终包含小数点后两位。最大值始终是整数。
4.样本输入
3
1 2 5 10 20 50
1 24 34 39 46 50
1 2 3 7 19 72
5.样本输出
2.96 5
2.52 3
2.80 4
6.解答
以下答案应该不对,不过样本好像就不对。第一个样例98=50+20+20+5+2+1,最大值应该为6,第二个样例23=23*1,最大值应该为23才对。
#include <iostream> using namespace std; int d[101]={0} ; //存放0到100元组成的硬币数 void min_coins(int i,int num,int *coins) //从i元开始凑够num元 { if(i == 0) { d[i] = 0; min_coins(1,num,coins); return; } else { int MIN = 9999; for(int j=0;j<6;j++) { if(i>=coins[j]) { MIN = min(d[i-coins[j]]+1,MIN); } } d[i] = MIN; if(i == num)return; else min_coins(i+1,num,coins); } } int average_max_coins(int *coin) { float average=0; int max=0; min_coins(0,100,coin); for(int i=1;i<=100;i++) { average += d[i]; if(max < d[i]) max = d[i]; } printf("%.2f %d\n",average/100,max); return 0; } int main() { int input_samples; cin >> input_samples; for(int i=0;i<input_samples;i++) { int coin[6]; for(int j=0;j<6;j++) cin >> coin[j]; average_max_coins(coin); } return 0; }

浙公网安备 33010602011771号