题解 B3793 [NICA #1] 自动取款机

· · 题解

小 A 要购买一件价值为 a 元的商品,而他的手上有 b 元现金。由于现金可能不够,他可能需要去银行提款。自动取款机可以提供无限张 100 元纸币。现在小 A 告诉了你 ab,他希望知道他至少要取多少张 100 元纸币,才能买下这个商品。

这道题的关键在于如何计算出至少要取多少张 100 元纸币。

如果我要买 450 元的商品,我现在有 12 元现金,我要取多少张纸币呢?4 张,是 412 元,不够;5 张是 512 元,够用了。如果是买 500 元的商品,有 200 元的现金,那么我们只要取 3 张纸币就够了。

这样分析,我们会想到用除法来解决这个问题。我们目前差多少钱?450-12=438,一张纸币 100 元,438 \div 100=4 \dots \dots 38。有余数,说明我们需要多用一张纸币。而 500-200=300300 \div 100=3,没有余数,就不要多用一张纸币了。

因此我们可以使用一个 if 判断完成这一道题。但是有没有更好的解决方案呢?有!

有余数,说明需要多用一张纸币。换而言之,只要余数大于等于 1,就需要多用一张纸币。我能不能直接把这个多出来的余数 1 凑掉呢?可以的,我们只要给被除数加上 99 就行了!例如说,如果 a-b=101,加上 99 变成了 200200 \div 100=2,恰好和前面用余数分类讨论的结果是一样的。

而且我们惊人的发现,这是通用的解法。比如说 199 元的差价,无论是看有没有余数,还是直接加上 99 后除以 100,最后算出来的结果都是 2;而且哪怕当差价为整百数的时候,例如说差价为 300 元,加上 99 变成 399,而 399 除以 100 的商是 3,也是符合的。因此,我们只要输出 (a-b+99) \div 100 就能完成这个题了。

但是这个题还有一个坑点!数据范围中,1 \leq b\leq a \leq 10^{12}。这意味着什么?int 的存储范围大概是负 20 亿到正 20 亿,而题目中的范围更大。因此,需要使用 long long 类型进行存储。

方法 1:使用 if 语句:

#include <iostream>
using namespace std;
int main() {
    long long a,b;
    cin >> a >> b;
    if ((a-b)%100!=0)
        cout << (a-b)/100+1;
    else
        cout << (a-b)/100;
    return 0;
}

方法 2:使用 +99 做法:


#include <iostream>
using namespace std;
int main() {
    long long a,b;
    cin >> a >> b;
    cout << (a-b+99)/100 << endl;
    return 0;
}