zoukankan      html  css  js  c++  java
  • Codeforces Round #552 (Div. 3) —— B. Make Them Equal

    B. Make Them Equal

    time limit per test2 seconds
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    You are given a sequence a1,a2,…,an consisting of n integers.

    You can choose any non-negative integer D (i.e. D≥0), and for each ai you can:

    add D (only once), i. e. perform ai:=ai+D, or
    subtract D (only once), i. e. perform ai:=ai−D, or
    leave the value of ai unchanged.
    It is possible that after an operation the value ai becomes negative.

    Your goal is to choose such minimum non-negative integer D and perform changes in such a way, that all ai are equal (i.e. a1=a2=⋯=an).

    Print the required D or, if it is impossible to choose such value D, print -1.

    For example, for array [2,8] the value D=3 is minimum possible because you can obtain the array [5,5] if you will add D to 2 and subtract D from 8. And for array [1,4,7,7] the value D=3 is also minimum possible. You can add it to 1 and subtract it from 7 and obtain the array [4,4,4,4].

    Input

    The first line of the input contains one integer n (1≤n≤100) — the number of elements in a.

    The second line of the input contains n integers a1,a2,…,an (1≤ai≤100) — the sequence a.

    Output

    Print one integer — the minimum non-negative integer value D such that if you add this value to some ai, subtract this value from some ai and leave some ai without changes, all obtained values become equal.

    If it is impossible to choose such value D, print -1.

    Examples

    input
    6
    1 4 4 7 4 1
    output
    3
    input
    5
    2 2 5 2 5
    output
    3
    input
    4
    1 3 3 7
    output
    -1
    input
    2
    2 8
    output
    3

    思路

    找出一个数能使所有给出的数中的一些数通过加/减去这个数全部变成相等的数,给出的数中有一些重复的,需要去重,然后为了好看,可以进行排序,排序+去重=set

    然后,如果集合中的数超过三个,那么问题肯定无解,比如1,2,3,4,不可能找到一个数使这四个数经过一些变换之后相等,所以超过三个数的集合直接输出-1;

    如果集合中有三个数,那么肯定是第一个数和第三个数经过加上一个数和减去一个数变成中间的数,如果第二个数减去第一个数等于第三个数减去第二个数,那么这个差就是结果,如果不等,说明无解;

    如果集合中有两个数,那么差就是第二个数减去第一个数,如果这个数是奇数,直接输出,如果是偶数,说明第一个数加上这个差的一半等于第二个数减去这个差的一半;

    如果集合中有一个数,则结果为0.

    Code

    #include <iostream>
    #include <set>
    using namespace std;
    int main()
    {
        set<int> num;
        int n,temp=0,s[107],p[107];
        while (~scanf("%d",&n)){
            num.clear();
            for (int i = 0; i < n; ++i) {
                cin>>s[i];
                num.insert(s[i]);
            }
            set<int>::iterator it;
            for (it=num.begin();it!=num.end();it++)
                p[temp++]=*it;
            switch (temp)
            {
                case 1:
                    cout<<'0'<<endl;
                    break;
                case 2:
                    if ((p[1]-p[0])%2!=0)
                    {
                        cout<<p[1]-p[0]<<endl;
                        break;
                    }
                    else
                    {
                        cout<<(p[1]-p[0])/2<<endl;
                        break;
                    }
                case 3:
                    if (p[1]-p[0]==p[2]-p[1])
                    {
                        cout<<p[1]-p[0]<<endl;
                        break;
                    }
                    else
                    {
                        cout<<"-1"<<endl;
                        break;
                    }
                default:
                    cout<<"-1"<<endl;
                    break;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    install_bugzilla
    R610 & R710 网卡问题
    总结开发者在合作过程中的典型交流方式
    vnc报错 font catalog is not properly configured
    eclipse插件安装
    extjs 点击链接到另一个页面 并激活另一个页面的指定tab
    centos c++ 找不到头文件mysql.h
    升级struts 2
    oracle 删除用户报错
    mysql 创建用户及授权
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338412.html
Copyright © 2011-2022 走看看