洛谷题解P6188 [NOI Online #1 入门组]文具订购
\(\text{Update On 2020.10.6}\) 鉴于之前的题解写的不好,进行了重做
原题传送门
\(\text{Solution}\)
首先想到的是 \(O(n^3)\) 的暴力。可是数据范围 \(0≤n≤10^5\) (又不是清北神机) 显然会 \(\text{TLE}\)
所以说要对这个暴力进行优化。
不难发现,在订购的原则里
\(7a+4b+3c=n\)
\(a,b,c\) 中的最小值尽可能大
最小值最大换句话来说就是 \(\to a,b,c的值尽量平均\)
不妨设 \(a=b=c\) ,此时关于 \(a,b,c\) 的方程 \(7a+4b+3c=n\) 的解为 \(a=b=c=\frac{n}{14}\)
订购原则还有一句话:
\(a+b+c\) 尽可能大
所以,我们可以 a从 \(\frac{n}{14}\) 开始 从大到小 枚举 (尽可能大,从大到小更快出结果)
\(b\) 边界 \(\frac{n}{4}\)
\(c\) 边界 \(\frac{n}{3}\)
\(Code\)
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int main(){
scanf("%d",&n);
if(n==0){ //一定注意特判 0 的情况
cout<<"0 0 0"<<endl;
return 0;
}
for(int i=n/14;i>=0;i--){ //a
for(int j=i;j<=n/4;j++){ //b
for(int l=i;l<=n/3;l++){ //c
if(i*7+j*4+l*3==n){
printf("%d %d %d",i,j,l);
return 0;
}
}
}
}
printf("-1");
return 0;
}
本文欢迎转载,转载时请注明本文链接