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)

    • 0
      @ 2024-12-22 11:04:05

      C :

      #include<stdio.h>
      int main()
      {
      	int sum,a,n;
      	while (~scanf("%d",&n)&&n!=0)
      	{
      		sum=0; a=n/3;
      		while (a!=0)
      		{
      		sum+=(n/3);
      		a=n/3;
      		n=n-3*a;
      		n=n+a;
      	    }
      	    if (n==2) sum++;
      	    printf("%d\n",sum);
      	}
      }
      

      C++ :

      #include<iostream>
      #include<cmath>
      #include<cstdio>
      #include<cstdlib>
      #include<cstring>
      using namespace std;
      int main()
      {
       int i,m,n=1,j,k=0;
       while (true)
       {
        cin>>n;
        if (n==0) break;
        k=0;
        if (n<3) cout<<"0";
         else
         {
         k=0;
         while (true)
          {
      	 j=n/3;
      	 k+=j;
      	 n=n%3;
      	 n+=j;
      	 if (n==2)
      	  k+=1;
           if (n<3)
      	  break;
          }
         cout<<k<<endl;
         }
       }
       return 0;
      }
      
      
      • 1

      信息

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