题意:n个候选人竞选一个职位,现在知道了每个候选人的得票数目,编号为1的候选人为了赢得选举,有一种“作弊”手段,贿赂给其竞争者投票的选民将选票改投给自己,即一号候选人本人。问最少贿赂几个人才能是他胜利(他的得票数严格大于其他所有候选人)?
即从数列中的某一项或者几项中减去一部分加到第一项中使得第一项为严格最大项,问第一项改变量的最小值。
感觉我想多了,然而不需要想多,模拟这个过程即可,因为规模很小,只有100。
每次取数列中最大项,如果不是第一项,就将其减一,第一项加一,同时ans++
这个时候会疏忽一个地方,是第二组样例,就是最后第一项成为最大值了但不是严格最大值,上面的过程识别不出来这个情况,这时候只用第一项加一,即答案加一单独写个判断即可.
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<stack>
#include<string>
#include<cstdlib>
#include<iomanip>
#define maxn 100010
//#define file
//#define inf 9223372036854775808
#define inf2 0x3f3f3f3f3f3f3f3f
using namespace std;
int n;
int a[110];
int main()
{
scanf("%d",&n);
int m=-1;
int index=-1;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>m)
{
m=a[i];
index=i;
}
}
int ans=0;
while(index!=0)
{
a[index]--;
a[0]++;
ans++;
m=-1;
for(int i=0;i<n;i++)
{
if(a[i]>m)
{
m=a[i];
index=i;
}
}
}
for(int i=1;i<n;i++)
{
if(a[i]==a[0]){
ans++;
break;
}
}
printf("%d\n",ans);
}