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;
    }
    
  • 相关阅读:
    poj 1475 Pushing Boxes 推箱子(双bfs)
    poj 1806 Frequent values(RMQ 统计次数) 详细讲解
    poj 2846 Repository
    poj Ping pong LA 4329 (树状数组统计数目)
    POJ 1962-Corporative Network (并查集)
    hdu 2217 Visit
    nyoj304 节能
    与R纠缠的两件事——rownames和子集--转载
    七步精通Python机器学习--转载
    win10专业版激活(亲测可用)
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338413.html
Copyright © 2011-2022 走看看