( ext{Update On 2020.10.6}) 鉴于之前的题解写的不好,进行了重做
原题传送门
( ext{Solution})
首先想到的是 (O(n^3)) 的暴力。可是数据范围 (0≤n≤10^5) (又不是清北神机) 显然会 ( ext{TLE})
所以说要对这个暴力进行优化。
不难发现,在订购的原则里
(7a+4b+3c=n)
(a,b,c) 中的最小值尽可能大
最小值最大换句话来说就是 ( o 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;
}