2 条题解

  • 0
    @ 2024-12-22 20:10:43

    这道题是一道模拟,所以……

    请看浅显易懂的代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n /*小张手上的空汽水瓶数*/;
    int kp /*空汽水瓶数*/, s /*喝的汽水瓶数*/ = 0;
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	while (true)
    	{
    		kp = s = 0;		// 重置
    		cin >> n;		// 输入
    		if (n == 0)		// 输入 0
    			break;		// 结束
    		kp = n;			// 有 n 个空汽水瓶
    		while (kp >= 2) // 空汽水瓶数大于等于 2
    		{
    			if (kp == 2) // 如果空汽水瓶数等于 2
    			{
    				// 先向老板借 1 个空汽水瓶,
    				// 然后就有了 3 个空汽水瓶,
    				// 可以换 1 瓶汽水,
    				// 喝完后还给老板。
    				++s;	// 喝了 1 瓶汽水
    				kp = 0; // 没有空汽水瓶
    				break;	// 结束
    			}
    			else // 否则空汽水瓶数大于 2
    			{
    				// 每三个空汽水瓶换一瓶汽水,
    				// 共可以换 kp / 3 瓶汽水,
    				// 剩下 kp % 3 个空汽水瓶。
    				// 喝完后得到 kp / 3 瓶汽水。
    				s += kp / 3;		  // 喝了 kp / 3 瓶
    				kp = kp % 3 + kp / 3; // 有 kp % 3 + kp / 3 个空汽水瓶
    			}
    		}
    		cout << s << '\n'; // 输出
    	}
    	return 0;
    }
    

    但是这太麻烦了,经过简单严谨的数学推导:

    我们可以向老板借瓶子,如果我们拿出 2 个空汽水瓶,再找老板借一个,我们就有了 3 个空汽水瓶,就可以换一瓶汽水了,喝完后再还给老板。也就是说,只要我们有 2 个瓶子就相当于我们能喝 1 瓶汽水

    比如说:

    我们有 10 个空汽水瓶,拿出来 2 个,找老板借 1 个,变成 3 个,换 1 瓶汽水,然后喝了还给老板,然后这 2 个空瓶 1 个不剩。 这样我们可以重复 10÷2=5 10 \div 2 = 5 次,每次能喝到 1 瓶汽水,也就是说我们能喝到 5 瓶汽水。 如果有 11 个空汽水瓶,那一定会多出 1 个,不信你可以试试。

    推广到一般的形式,n n 个空汽水瓶恰好能换到 n÷2 \lfloor n \div 2 \rfloor 瓶汽水。

    容易写出代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int kp, s = 0;
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	while (true)
    	{
    		cin >> n;
    		if (n == 0)
    			break;
    		cout << n / 2 << '\n';
    	}
    	return 0;
    }
    

    写了这么多,不点个赞再走吗?(bushi)

    信息

    ID
    341
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者