1 条题解

  • 0
    @ 2025-8-24 22:18:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar lzqy_
    生而绚烂,璀璨如花。

    搬运于2025-08-24 22:18:21,当前版本为作者最后更新于2020-03-08 09:09:17,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    和我一样初学OI的新手看过来了,不用算法、不用DP、不用循环甚至变量都只需两个!!!

    最无脑代码推导过程:

    我们一个一个条件地分析:

    1、要花光所有的钱

    首先,三种文具的价格是3,4,73,4,7,通过证明,发现除了n=1n=1,n=2n=2,n=5n=5以外,任何的价格nn都可以被花光,所以这个条件并没有什么太大的约束力;

    2、尽量配成更多套

    一套的价钱是1414元,所以这个规定就是要我们尽可能地买更多的整1414元;

    3、尽量买更多的物品

    这个规定其实就是在我们买了尽可能多的整1414元之后,剩余的钱再尽量拆分成33元或44元(因为7=3+47=3+4,这样买的物品数量就会减少,所以不买77元的东西)

    好了,题目分析完了,我们归纳一下:


    ans=n/14;
    
    n%=14;
    
    if(n==?)
    
    {
    
       cout<<ans<<" "<<ans+?<<" "<<ans+?;
       
       return 0;
       
    }
    
    if(n==?)
    
        ·
        ·
        ·
        ·
    
    (注:由于是伪代码,所以?处是代表一个数字)
    

    看见了吗?其实这道题就是一个除法,再加上好多个ifif就解决了。。。

    但是细心的朋友可能会发现,这个算法有一个漏洞:

    如果买完尽量多的套数以后,剩下的是1,2,51,2,5元呢?这样不就不满足第一个条件了吗?

    不用担心,这个问题很简单,我们只需要少配一套物品,再拿出14元来,不就可以花完钱了吗?

    所有的问题都处理完了,无算法、无dp甚至无循环的代码就出现了:

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
      int n,ans=0;//ans用来记录套数
      cin>>n;
      if(n==0)//若n=0,则直接输出答案;
      {
        cout<<0<<" "<<0<<" "<<0;
        return 0;
      }
      if(n<6 && n!=4 && n!=3)//若n无法分完,则直接输出答案;
      {
        printf("-1");
        return 0;
      }
      ans=n/14;
      n%=14;//本代码的核心部分(个人觉得),求套数
      if(n<6 && n!=4 && n!=3 && n!=0)
        ans--,n+=14;//若在套数最多时n分不完,套数-1;
        if(n==0)//若正好分完,直接输出三个套数
        {
        	cout<<ans<<" "<<ans<<" "<<ans<<endl;
        	return 0;
    	}
       //准备,最长if特判就要来了:                                        
      if(n==3)
      {
        cout<<ans<<" "<<ans<<" "<<ans+1<<endl;
        return 0;
      }
      if(n==4)
      {
        cout<<ans<<" "<<ans+1<<" "<<ans<<endl;
        return 0;
      }
      if(n==6)
      {
        cout<<ans<<" "<<ans<<" "<<ans+2<<endl;
        return 0;
      }
      if(n==7)
      {
        cout<<ans<<" "<<ans+1<<" "<<ans+1<<endl;
        return 0;
      }
      if(n==8)
      {
        cout<<ans<<" "<<ans+2<<" "<<ans<<endl;
        return 0;
      }
      if(n==9)
      {
        cout<<ans<<" "<<ans<<" "<<ans+3<<endl;
        return 0;
      }
      if(n==10)
      {
        cout<<ans<<" "<<ans+1<<" "<<ans+2<<endl;
        return 0;
      }
      if(n==11)
      {
        cout<<ans<<" "<<ans+2<<" "<<ans+1<<endl;
        return 0;
      }
      if(n==12)
      {
        cout<<ans<<" "<<ans<<" "<<ans+4<<endl;
        return 0;
      }
      if(n==13)
      {
        cout<<ans<<" "<<ans+1<<" "<<ans+3<<endl;
        return 0;
      }
      if(n==15)
      {
        cout<<ans<<" "<<ans<<" "<<ans+5<<endl;
        return 0;
      }
      if(n==16)
      {
        cout<<ans<<" "<<ans+1<<" "<<ans+4<<endl;
        return 0;
      }
      if(n==19)
      {
        cout<<ans<<" "<<ans+1<<" "<<ans+5<<endl;
        return 0;
      }
      //是的,这样就没了(亲测,可以AC)
      return 0;
    }
    

    代码虽长,但是思路任何人都可以明白,并且只要nn在整型范围内,都可以秒解。

    写题解不易,觉得好的,留个赞再走呗~

    • 1

    信息

    ID
    5220
    时间
    1000ms
    内存
    250MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者