3 条题解

  • 4
    @ 2022-8-17 19:56:54

    95分做法/取巧100分

    #include<bits/stdc++.h>
    using namespace std;
    short m,a[6];
    // haveCard 当前持有的卡片数量
    // haveDrink 当前未喝的饮料数量(have是“拥有”而不是“已经”)(drink是名词而不是动词)
    // cnt 计数器(程序走了多少步)
    int n,haveCard[6],haveDrink,cnt;
    bool flag=true;
    int main(){
        cin>>n>>m;
        for(short i=1;i<=m;i++){
            cin>>a[i];
            haveCard[i]+=n; // 初始化卡片持有数
            // 一个简单的关于是否可以白嫖的判断(不完善,但可以拿95分了)
            if(a[i]>m||a[i]>n)flag=false; // 当a的每一项同时小于等于m,n时,肯定可以白嫖
        }
        if(flag)cout<<"Inf";
        else{
            do{ // do{}while();形式用法自行百度
                n+=haveDrink; // 增加已喝
                haveDrink=0; // 重置未喝
                cnt++; // 新一轮(从1开始)
                for(short i=1;i<=m;i++){ // 判断是否满足兑换条件
                    if(haveCard[i]>=a[i]){
                        int x=haveCard[i]/a[i];
                        haveDrink+=x; // 兑换完后增加未喝
                        haveCard[i]%=a[i]; // 减少卡片数量
                    }
                }
                if(haveDrink==0)break; // 如果没有未喝了就说明无法再兑换了,运行结束
                // 如果不加下面这个if的话程序20样例只过了19个,95分
                if(cnt>55){ // 作用大概就是骗分()()
                    cout<<"Inf"; // 如果程序进行太多步了就大概率是可以白嫖了
                    return 0;
                }
                for(short i=1;i<=m;i++){
                    haveCard[i]+=haveDrink; // 根据未喝数量增加卡片数量
                }
            }while(1);
            cout<<n;
        }
        return 0;
    }
    
    • @ 2023-7-27 15:39:54
      #include<bits/stdc++.h>
      using namespace std;
      short m,a[6];
      int n ,haveCard[6] ,haveDrink ,cnt;
      bool flag=true;
      int main()
      {
          cin >> n >> m;
          for(short i = 1;i <= m;i++)
      	{
              cin >> a[i];
              haveCard[i] += n;
              if(a[i] > m || a[i] > n)
      			flag = false;
          }
          if(flag)
      		cout << "Inf";
          else
      	{
              do
      		{ 
                  n += haveDrink;
                  haveDrink = 0;
                  cnt++;
                  for(short i = 1;i <= m;i++)
      			{
                      if(haveCard[i] >= a[i])
      				{
                          int x = haveCard[i]/a[i];
                          haveDrink += x;
                          haveCard[i] %= a[i];
                      }
                  }
                  if(haveDrink == 0)
      				break;
                  if(cnt > 55)
      			{
                      cout << "Inf";
                      return 0;
                  }
                  for(short i = 1;i <= m;i++)
      			{
                      haveCard[i] += haveDrink; 
                  }
              }while(1);
              cout << n;
          }
          return 0;
      }
      
  • 2
    @ 2022-8-3 14:03:05

    给大家提个醒,这道题要开long long,而且如果要暴力的话循环次数不要太大,1~50001就可以了,太大会超时 顶级骗分

    • -7
      @ 2022-4-24 16:44:32

      写题解请注意

      鼓励大家写题解,但注意题解格式。

      题解一定要有思路解析或代码注释,能否让别人理解你的思路

      也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

      给代码两端加上这个会舒服一些

      ```cpp

      你的代码

      ```

      </span>

      这个点在键盘的左上角tab上面那个键,注意切换输入法

      #include<iostream>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;//这是一个注释
          return 0;
      } 
      

      请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

      抄袭题解一经发现直接取消成绩。

      题解被删除的可能

      1. 代码不符合格式规范
      2. 没有思路讲解或者没有注释,
      3. 无意义的题解

      大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • 1

      信息

      ID
      1264
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      210
      已通过
      88
      上传者