UVa 10717 - Mint

来源:互联网 发布:arttemplate 遍历数组 编辑:程序博客网 时间:2024/05/20 10:12

題目:給定n種硬幣,想要從其中取出四中當做桌子的腿,如果目標高度已知,求兩側最接近的高度。

分析:數論。枚舉其中的四格硬幣,計算最小公倍數,然後求出目標高度最接近兩個公倍數即可。

說明:注意使用long long,防止溢出╮(╯▽╰)╭。

#include <cstdio>typedef long long ll;int gcd(int a, int b){return a%b?gcd(b, a%b):b;}ll  lcm(int a, int b){return 0LL+a/gcd(a, b)*b;}int main(){int n, m, table, coins[51];ll  L[51], R[51];while (~scanf("%d%d",&n,&m) && n && m) {for (int i = 0; i < n; ++ i)scanf("%d",&coins[i]);for (int i = 0; i < m; ++ i) {scanf("%d",&table);ll min = 0, max = -1, lcmvalue;for (int a = 0; a < n; ++ a)for (int b = 0; b < a; ++ b)for (int c = 0; c < b; ++ c)for (int d = 0; d < c; ++ d) {lcmvalue = lcm(coins[a], coins[b]);lcmvalue = lcm(lcmvalue, coins[c]);lcmvalue = lcm(lcmvalue, coins[d]);L[i] = table/lcmvalue*lcmvalue;if (table == L[i])R[i] = L[i];else R[i] = L[i]+lcmvalue;if (min < L[i])min = L[i];if (max < 0 || max > R[i])max = R[i];}printf("%lld %lld\n",min,max);}}    return 0;}


0 0
原创粉丝点击