京東2016筆試題 小東拉票
阿新 • • 發佈:2019-01-09
//小東拉票
/*
輸入:
輸入有若干組,每組包含兩行,第一行為一個正整數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; }