UVa 10717 - Mint

题意:

给出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;
}
	



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值