题意:有一群袋鼠去餐厅吃饭,每只袋鼠吃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; }