给n个数,第一个数是自己的票数,其他是别人的票数,要求你去拉票(别人减少了多少票你就会加多多少票)、使得自己票数大于所有人
对2到n的人排序,一直取最大的前k个求平均数,判断得到的值是否大于i-1个就可以了、O(N)复杂度
//处理一下后缀和,复杂度o(n)搞定了
//贪心
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int tm[105];
int suf_sum[105];
int main()
{
int n,i,j,tmp;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&tm[i]);
}
sort(tm+2,tm+1+n); //2-n个人的票数排序
for (i=n;i>=2;i--)//预处理好后缀和
{
suf_sum[i]=suf_sum[i+1]+tm[i];
}
int self=tm[1];
if (tm[1]>tm[n]) //不用拉票情况
{
printf("0\n");
return 0;
}
for (i=n;i>=2;i--)
{
int cun=suf_sum[i];//i到n序号对应数的和
cun+=tm[1];//还要算上自己
int num=n-i+1+1;//个数
tmp=cun%num;//余数
cun=cun/(num);//得到 一个 平均数
if (tmp<=1)//如果余数=1,直接把余数1给自己,如果余数=0,则再拉多一票给自己,所以都是cun++
cun++;
else //其他情况,只要给自己2票,剩下的都给别人每人一票(因为是余数,所以tmp<num,即这样分一定不会除了自己的人会拿到2票)
cun+=2;
if (tm[i-1]<cun) //经过上面的分配方法后自己得到的票肯定大于i-n个人,如果再大于第i-1个人,就代表大于所有人了,如果不大于,把这个人加进去,得到更大的平均数
{
printf("%d\n",cun-tm[1]);
return 0;
}
else
continue;
}
return 0;
}