Gym 101350C 思维

题意:有一群袋鼠去餐厅吃饭,每只袋鼠吃xi的食物,每个x大的盘子可以装x多的食物,并且价格为x。现在问你有一群袋鼠,给出他们的食量,问最少花费和最大盘子尺寸是多少。

样例:

2
1
5
2
4 2

out

5 5
6 2

思路:最少花费肯定是食物的量,因为大不了都用规格为1的盘子。而盘子尺寸应该是满足:

1.整数个盘子恰好可以装下每只袋鼠的食量  

2.盘子尽量大

所以:由上可以看出,其实是求这些袋鼠食量的最大公约数(get求一系列数字的最大公约数)

代码:

#include <iostream>·
#include<cstdio>
using namespace std;
int gcd(int a,int b)
{
    if(a<b)
    {
        int t=a;
        a=b;
        b=t;
    }
    while(b!=0)
    {
        int k=a%b;
        a=b;
        b=k;
    }
    return a;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        long long int sum=0;
        int y;
        scanf("%d",&y);
        sum+=y;
        int k=y;
        for(int i=1;i<n;i++)//多个数求最大公约数
        {
            scanf("%d",&y);
            sum+=y;
            if(y%k!=0)//如果y是k的倍数,则公约数就是k
            {
                k=gcd(k,y);//否则再求y与上一个最大公约数的公约数
            }
        }
        printf("%lld %d\n",sum,k);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40772692/article/details/80164516