codeforces 389A. Fox and Number Game

来源:互联网 发布:家具导购软件 编辑:程序博客网 时间:2024/05/18 02:53

题目链接[CF 389A.] (http://codeforces.com/problemset/problem/389/A):
题目描述:
A. Fox and Number Game
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
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 i and 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 test(s)
input
2
1 2
output
2
input
3
2 4 6
output
6
input
2
12 18
output
12
input
5
45 12 27 30 18
output
15
Note
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.

言简意赅:
此题题意为可以连续多次利用ai=ai-aj,直到把ai中的每一个数变成最小且相等时,既满足题意中的条件不再能进行操作了,所以可以借助于直接暴力的代码进行实现.

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int a[105];int main(){    int n;    int flag;    while(scanf("%d",&n)!=EOF)    {        flag=0;        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);        }        while(1)        {            sort(a,a+n,greater<int>());            flag=0;            for(int i=0;i<n-1;i++)            {                if(a[i]>a[i+1])                a[i]=a[i]-a[i+1];                else flag++;            }            if(flag==n-1)            break;        }        printf("%d\n",n*a[0]);    }    return 0;}

当然此题的本意可以简化为要去求解所有数的最大公约数的问题,代码实现如下:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int gcd(int a,int b){    if(!b)    return a;    else return gcd(b,a%b);}int a[105];int main(){    int n;    int k;    while(scanf("%d",&n)!=EOF)    {        for(int i=0; i<n; i++)        {            scanf("%d",&a[i]);        }        k=gcd(a[0],a[1]);        for(int i=2; i<n; i++)        {            k=gcd(k,a[i]);        }    printf("%d\n",n*k);    }    return 0;}

如果代码还不能A掉,那就不能去睡觉。

0 0
原创粉丝点击