题解 P6188 【[NOI Online 入门组]文具订购(民间数据)】
和我一样初学OI的新手看过来了,不用算法、不用DP、不用循环甚至变量都只需两个!!!
最无脑代码推导过程:
我们一个一个条件地分析:
1、要花光所有的钱:
首先,三种文具的价格是
2、尽量配成更多套
一套的价钱是
3、尽量买更多的物品 :
这个规定其实就是在我们买了尽可能多的整
好了,题目分析完了,我们归纳一下:
ans=n/14;
n%=14;
if(n==?)
{
cout<<ans<<" "<<ans+?<<" "<<ans+?;
return 0;
}
if(n==?)
·
·
·
·
(注:由于是伪代码,所以?处是代表一个数字)
看见了吗?其实这道题就是一个除法,再加上好多个
但是细心的朋友可能会发现,这个算法有一个漏洞:
如果买完尽量多的套数以后,剩下的是
不用担心,这个问题很简单,我们只需要少配一套物品,再拿出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;
}
代码虽长,但是思路任何人都可以明白,并且只要
写题解不易,觉得好的,留个赞再走呗~