1. 程式人生 > >京東2016筆試題 小東拉票

京東2016筆試題 小東拉票

//小東拉票
/*
輸入:
輸入有若干組,每組包含兩行,第一行為一個正整數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;
}