1 条题解

  • 0
    @ 2025-8-24 22:40:51

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Vct14
    **

    搬运于2025-08-24 22:40:51,当前版本为作者最后更新于2023-04-20 19:43:45,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    题意

    nn 瓶饮料,喝完 33 瓶可以换 11 瓶,求最后一共可以喝多少瓶。

    解法

    思路 11

    暴力模拟。

    设瓶盖数为 mm。当 m3m\ge3 时一直循环模拟换购,每次循环表示用当前剩余的瓶盖换购后,再将新的饮料喝完。我们称这样一次循环为“一轮”。

    每一轮可以多换购 m3\left\lfloor\dfrac{m}{3}\right\rfloor 瓶,还剩下 mmod3m\mod 3 个瓶盖,而喝完后,又会多 m3\left\lfloor\dfrac{m}{3}\right\rfloor 个瓶盖。

    思路 22

    列方程。

    设最后喝了 xx 瓶饮料,则共有 xnx-n 瓶饮料是换购来的。

    因为最后 11 个瓶盖无法换购,那么实际参与了换购的瓶盖只有 x1x-1 个。

    则可以列出方程:

    xn=x13x-n=\dfrac{x-1}{3}

    最后得:

    x=3n12x=\dfrac{3n-1}{2}

    故答案为 3n12\dfrac{3n-1}{2}

    代码

    思路 11

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        int n;//我们可以直接用 n 代表剩余瓶盖数
        cin>>n;
        int sum=n;//sum 为总喝的饮料数
        while(n>2) sum+=n/3,n=n%3+n/3;//模拟换购
        cout<<sum;
        return 0;
    }
    

    思路 22

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
    	int n;
    	cin>>n;
    	cout<<(3*n-1)/2;//推出的式子
    	return 0;
    }
    
    • 1

    信息

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