Description
Fox Ciel is playing a game with numbers now.
Ciel has n positive integers: x1, x2, ..., xn. She can do the following operation as many times as needed: select two different indexes iand j such that xi > xj hold, and then apply assignment xi = xi - xj. The goal is to make the sum of all numbers as small as possible.
Please help Ciel to find this minimal sum.
Input
The first line contains an integer n (2 ≤ n ≤ 100). Then the second line contains n integers: x1, x2, ..., xn (1 ≤ xi ≤ 100).
Output
Output a single integer — the required minimal sum.
Sample Input
2 1 2
2
3 2 4 6
6
2 12 18
12
5 45 12 27 30 18
15
Hint
In the first example the optimal way is to do the assignment: x2 = x2 - x1.
In the second example the optimal sequence of operations is: x3 = x3 - x2, x2 = x2 - x1
题目大意:给出n个数的序列,任意找出一对i,j&&i!=j的xi和xj使得xi>xj从而改变xi的值为xi=xi-xj;
直到所有的值都相等为止。使得最后序列的和最小
ps:当天晚上做的vj 的题,这次就像打了鸡血一样只有ac。- -
基本思路:要想使得最后的和最小,我是从最大的那个和次大的值做减法,循环这样的方式,直到找不到次大的那个值为止,也就是所有的值相当了
#include <iostream>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
int main()
{
int n,x,y;
priority_queue<int ,vector<int >,less<int > >q;
stack<int >p;
while(~scanf("%d",&n))
{
while(!q.empty())q.pop();
while(!p.empty())p.pop();
for(int i=0; i<n; i++)
{
scanf("%d",&x);
q.push(x);
}
while(!q.empty())
{
x=q.top();
q.pop();
y=q.top();
if(x>y)
{
x=x-y;
q.push(x);
while(!p.empty())
{
q.push(p.top());
p.pop();
}
continue;
}
else
{
p.push(x);
}
}
x=p.top();
printf("%d\n",x*n);
}
return 0;
}