妈妈给n个孩子分糖果,开始时第i个孩子有ai个糖果,现在要求选择一个数字D(D为正数),对n个孩子的糖果分别进行以下三种操作中的一种:1、不变,2、给D个,3、收回D个。问能否经过操作后使所有的孩子的糖果数量都相等,若可以,输出数字D,反之输出-1。(对每个孩子只进行一次操作,可以认为妈妈手中有无限个糖果,最终是要使所有孩子的拥有的糖果数量相等。)
输入
第一行一个数字n(1<=n<=10000)
第二行n个数字,第i个数字为ai(1<=ai<=1000)
输出
若可以找到D,输出D,反之输出-1。
如果有多个符合要求的D,输出最小的一个。
输入样例 1
6 1 4 4 7 4 1
输出样例 1
3
输入样例 2
5 2 2 5 2 5
输出样例 2
3
输入样例 3
4 1 3 3 7
输出样例 3
-1
题解:由题意知数组中最多有3个不同的数字,可以用set统计,然后根据有多少不同的数字进行分类处理。
若为1,输出1;若为2,讨论x2-x1的奇偶性,若为偶数,输出(x2-x1)/2,反之输出x2-x1;
若为3,讨论是否x3-x2==x2-x1,若输出x3-x2,否则输出-1;
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+2;
int a[N], b[1001];
set<int> all;
int main(){
int n; cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
all.insert(a[i]);
if(all.size()>3){
cout<<-1<<endl;
return 0;
}
}
int p[3]={0},t=0;
set<int>::iterator ite;
for(ite=all.begin();ite!=all.end();++ite){
p[t++]=*ite;
}
if(t==1) cout<<1<<endl;
else if(t==2){
if((p[1]-p[0])%2==0)
cout<<(p[1]-p[0])/2<<endl;
else
cout<<(p[1]-p[0])<<endl;
}
else{
if(p[1]-p[0]==p[2]-p[1])
cout<<p[1]-p[0]<<endl;
else cout<<-1<<endl;
}
return 0;
}