CF552-Div3-B. Make Them Equal

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].

题意:给你n个数,你可以对任意一个ai(可能重复)进行三种操作(有三种操作,只能选一种且只能进行一次):1.给ai加上D. 2. 给ai减去D 3.不对ai做任何操作.(D>=0)

让你求出最小的D,在对每个元素进行操作以后,使每个元素都相等.
如果不存在,输出 -1 .

题解:首先对于相同的元素,对他们的操作都是一样的,所以我们只要统计不同数就行,不同数的个数记为N.

先对不同数进行sort排序,

分成四种情况: 1. N>3 肯定不存在,输出 -1 2. N=3,这三个不同的数必须满足等差数列,即 (x1+x3)=x2*2,才有D,输出x2-x1,否则输出 -1 3.N=2 两种情况 1)如果 x2-x1 的结果是偶数,那么输出 (x2-x1)/2,否则输出 x2-x1 4.N=1 无需任何操作,输出 0

#include <bits/stdc++.h>
using namespace std;
const int N=105;
int a[N];
int b[N];
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        int tmp;cin>>tmp;
        a[tmp]++;
    }
    
    int cnt=0;
    for(int i=1;i<=100;i++) if(a[i]>0) b[++cnt]=i;
    
    sort(b+1,b+1+cnt);
    if(cnt>3) puts("-1");
    else if(cnt==3){
        if(b[1]+b[3]==b[2]*2){
            cout<<b[2]-b[1]<<endl;
        }
        else puts("-1");
    }
    else if(cnt==2){
        if((b[2]-b[1])%2==0){
            cout<<(b[2]-b[1])/2<<endl;
        }
        else cout<<b[2]-b[1]<<endl;
    }
    else cout<<"0"<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/-yjun/p/10727244.html