洛谷题解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; 
}
posted @ 2020-03-19 15:10  _pwl  阅读(512)  评论(1编辑  收藏  举报
1 2 3
4