Problem E: 小力的数字游戏
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 42 Solved: 21
[ Submit][ Status][ Web Board]
Description
小力在玩一个数字游戏。
一共有n个整数:X1,X2,X3,X4,……,Xn。他可以做任意次如下操作:
在n个数中任意选择两个不同的数,假设为Xi,Xj,( Xi > Xj )。然后他可以将Xi变为Xi-Xj。
小力想让n个数的总和尽可能小,请你帮助小力找到这个最小和。
Input
输入读到文件末尾。
每组测试样例两行。
第一行一个整数n(2<=n<=100)。
第二行n个数,为初始的数组(1<=X<=100)。
Output
每组测试样例一行,输出一个整数,为数组的最小和。
Sample Input
21 232 4 6212 18545 12 27 30 18
Sample Output
261215
HINT
第一组样例中:X2 = X2 - X1;
第二组样例中:X3 = X3 - X2, X2 = X2 - X1.
这题一开始我就看题目,理解它减来减去的到底要做什么?如果有个1的话那就是1,慢慢的看规律,发现就是求这些数字的最大公约数,那么答案就是最大公约数*数目就可以了。我贴一下我的代码,求最大公约数的算法是很普通的算法,效率比较低,但还是A过了,说明这个数据应该不是很强。
#include <stdio.h>
int partion(int g_Number[],int p,int r);
void QuickSort(int g_Number[],int p,int r);
void main(void)
{
int i,n;
int a[100];
int x,t;
while (scanf("%d",&n) != EOF)
{
for (i = 0;i < n;i ++)
{
scanf("%d",&a[i]);
}
QuickSort(a,0,n - 1);
x = 1;
t = 1;
while (1)
{
for (i = 0;i < n;i ++)
{
if (a[i] % t != 0)
{
break;
}
}
if (t > a[0])
break;
if (i == n)
x = t;
t ++;
}
printf("%d\n",x * n);
}
}
int partion(int g_Number[],int p,int r)
{
int tem;
int x = g_Number[r];
int i = p - 1,j;
for (j = p;j < r;j ++)
{
if (g_Number[j] < x)
{
tem = g_Number[i + 1];
g_Number[i + 1] = g_Number[j];
g_Number[j] = tem;
i ++;
}
}
tem = g_Number[r];
g_Number[r] = g_Number[i + 1];
g_Number[i + 1] = tem;
return i + 1;
}
void QuickSort(int g_Number[],int p,int r)
{
int q;
if (p < r)
{
q = partion(g_Number,p,r);
QuickSort(g_Number,p,q - 1);
QuickSort(g_Number,q + 1,r);
}
}