CCF NOI1034 钞票兑换

原题链接:1034. 钞票兑换

时间限制: 1000 ms  空间限制: 262144 KB  具体限制  

题目描述

将任意给定的整百元钞票,兑换成10元、20元、50元小钞票形式。输出兑换方案总数。

输入

输入需要兑换的钞票总数n。

输出

输出方案总数。

样例输入

100

样例输出

10

数据范围限制

100<=n<=1000000

提示

方案序号10元张数20元张数50元张数100220503121424053116430750186209810101000 

题记:

这道题用暴力枚举法会超时,所以要想办法优化一下。

方法一(好理解):先算出最多可以换成多少个50元,(用fifty_max表示),然后算出在换成不同张数50元的情况下,最多可以换多少个20元(twenty_max),每种情况下方案数(count)就是twenty_max+1。把所有方案数加起来即为结果。

你如果不知道方案数怎么来的,为什么是twenty_max+1,可以这样想:twenty_max是兑换成1、2、3……、twenty_max张20元的情况,1是兑换成0张20元,即都换成10元的情况。

方法二(最简洁):找到数学规律,说不清为什么(以后我找到合适的语言解释了再补充吧)……但是这么做是对的!这种方法看看就行了,想不到就算了……具体看代码吧。

两种方法C++程序如下:

(方法一)

#include<iostream>
using namespace std;

int main(void){
    int n, fifty_max, twenty_max, count=0;
    
    cin >> n;
    fifty_max = n/50;
    for(int i=0; i<=fifty_max; i++){
        twenty_max = (n-50*i)/20;
        count += twenty_max + 1;
    }
    cout << count;

    return 0;
}

(方法二)

#include<iostream>
using namespace std;

int main(void){
    int n, m, count=0;
    
    cin >> n;
    m = n/100;
    count = 5*m*m + 4*m + 1;
    cout << count;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/fyy_lufan/article/details/82424931