您的位置:首页 > 其它

UVA - 10717 Mint

2013-10-16 14:03 288 查看
题意:给你n种硬币厚度,m张桌子,让你求使得桌子平衡的数,一个要求输出不超过给定值的最大高度,一个是超过给定值的最小高度,其实就是求四个数的最小公倍数,利用公式lcm(a,b)=a*b/gcd(a,b),然后就是在枚举四种可能的同时找到最大和最小值,特殊的是当给定值恰好是最小公倍数的倍数时,最大最小值都是等于给定值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 60;

int coin[MAXN];
int n,t;

int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}

int main(){
    while (scanf("%d%d",&n,&t) != EOF && n+t){
        for (int i = 0; i < n; i++)
            scanf("%d",&coin[i]);

        int a,ans,Max,Min;
        for (int d = 0; d < t; d++){
            scanf("%d",&a);
            Max = 0,Min = INF;
            for (int i = 0; i < n-3; i++){
                for (int j = i+1; j < n-2; j++){
                    int m = coin[i]*coin[j]/gcd(coin[i],coin[j]);
                    for (int k = j+1; k < n-1; k++){
                        int mm = m*coin[k]/gcd(m,coin[k]);
                        for (int l = k+1; l < n; l++){
                            ans = mm*coin[l]/gcd(mm,coin[l]);
                            int x,y;
                            if (a%ans == 0)
                                x = y = a;
                            else x=(a/ans)*ans,y=(a/ans+1)*ans;
                            Max = max(x,Max);
                            Min = min(y,Min);
                        }
                    }
                }
            }
            printf("%d %d\n",Max,Min);
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: