//小东拉票
/*
输入:
输入有若干组,每组包含两行,第一行为一个正整数n(2<=n<=100),表示候选者数量,
第二行为每个候选人预期得到的选票数(第一个为小东的预期选票数),以空格分开,每人的预期得票数在1到1000之间
(包含1和1000)
经过小东的争取后,可能出现候选人的票数为0或超过1000的情况
输出:
对每组测试数据,单独输出一行,内容为小东最少需要争取的选票数
样例输入:
5
5 1 22 2 8
4
1 8 8 8
2
7 6
样例输出:
4
6
0
问题分析
输入包括每个候选人预期得到的票数,小东要想赢得选举,则必须要争取
让自己的选票在所有候选人里面最高,最好的办法就是从当前得票最高的人手里争取
过来选票,这样,最高票数肯定少了,自己得票多了,离自己得票最高才会更快的靠近
解决办法
每次从当前得票最高的人手里争取一张选票过来,直到自己的票数最高为止
/*
输入:
输入有若干组,每组包含两行,第一行为一个正整数n(2<=n<=100),表示候选者数量,
第二行为每个候选人预期得到的选票数(第一个为小东的预期选票数),以空格分开,每人的预期得票数在1到1000之间
(包含1和1000)
经过小东的争取后,可能出现候选人的票数为0或超过1000的情况
输出:
对每组测试数据,单独输出一行,内容为小东最少需要争取的选票数
样例输入:
5
5 1 22 2 8
4
1 8 8 8
2
7 6
样例输出:
4
6
0
问题分析
输入包括每个候选人预期得到的票数,小东要想赢得选举,则必须要争取
让自己的选票在所有候选人里面最高,最好的办法就是从当前得票最高的人手里争取
过来选票,这样,最高票数肯定少了,自己得票多了,离自己得票最高才会更快的靠近
解决办法
每次从当前得票最高的人手里争取一张选票过来,直到自己的票数最高为止
#include <iostream>
using namespace std;
int main()
{
int N;
while (cin >> N)
{
int * votes = new int[N];
for (int i = 0; i < N; i++)
{
cin >> votes[i];
}
bool flag = true;
int count = 0;
while (flag)
{
//找到选票最大的人
int imax = 0;
for (int i = 0; i < N; i++)
{
if (votes[i] >= votes[imax]) //注意这里必须是>=,才能保证得票最高,若是>,则会出现并列第一的情况
{
imax = i;
}
}
if (imax == 0)
{
break;
}
else
{
votes[imax]--;
votes[0]++;
count++;
}
}
cout << count << endl;
}
return 0;
}