1 条题解

  • 0
    @ 2025-8-24 21:15:06

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:15:05,当前版本为作者最后更新于2023-06-22 20:34:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

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

    如果我要买 450450 元的商品,我现在有 1212 元现金,我要取多少张纸币呢?44 张,是 412412 元,不够;55 张是 512512 元,够用了。如果是买 500500 元的商品,有 200200 元的现金,那么我们只要取 33 张纸币就够了。

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

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

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

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

    但是这个题还有一个坑点!数据范围中,1ba10121 \leq b\leq a \leq 10^{12}。这意味着什么?int 的存储范围大概是负 2020 亿到正 2020 亿,而题目中的范围更大。因此,需要使用 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+99 做法:

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

    信息

    ID
    8501
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者