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;
    }
    
  • 相关阅读:
    python 写入txt的新方法
    python 对excel进行截图
    python 关于excel弹窗——请注意,您的文档的部分内容可能包含了文档检查器无法删除的个人信息解决方法
    python win32com 读取带密码的excel
    移动硬盘——显示盘符但打不开
    python datetime和time的一些疑惑解答 及 获取上年同期、上月等日期
    pyinstaller 打包exe程序读不到配置文件No such file
    Python之——爱心代码参与情人节
    《易学设计模式》-笔记
    "高级"数据库小结
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338412.html
Copyright © 2011-2022 走看看