分糖果

 

妈妈给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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值