题意:
给出n个硬币的厚度以及t张桌子的高度,求硬币四种组合的最大<=于标准高度以及最小>=标准高度(每个桌腿一种硬币,并且高度一致)
思路:
由于桌腿高度一致,则必须求出用的四种硬币的公倍数
首先枚举取得硬币的所有了能,用四层各代表一个硬币,由于底层一定小于上一层,所以不会重
然后最大<=标准高度就是标准/公倍数*公倍数,如果最大<=标准与标准相同,则最小>=标准也是这个值
如果不同,则最小>=标准就是这个值+公倍数
代码:
#include<cstdio>
#define ll long long
int n, t;
long long table[55], h;
long long l[55], r[55];
long long gcd(long long a, long long b) {
return a%b?gcd(b, a%b):b;
}
long long lcm(long long a, long long b) {
long long temp = gcd(a, b);
return (0LL) + a/temp*b;
}
int main() {
while(scanf("%d%d", &n, &t) && n+t) {
for(int i=0; i<n; i++)
scanf("%lld", &table[i]);
for(int q=0; q<t; q++) {
scanf("%lld", &h);
long long temp;
long long minn = 0, maxn = -1;
for(int i=0; i<n; i++)
for(int j=0; j<i; j++)
for(int m=0; m<j; m++)
for(int w=0; w<m; w++){
temp = lcm(table[i], table[j]);
temp = lcm(temp, table[m]);
temp = lcm(temp, table[w]);
l[q] = h/temp*temp;
if(l[q] == h) r[q] = l[q];
else r[q] = l[q]+ temp;
if(minn == 0 || minn < l[q])
minn = l[q];
if(maxn == -1 || maxn > r[q])
maxn = r[q];
}
printf("%lld %lld\n", minn, maxn);
}
}
return 0;
}