京东2016实习生招聘
C++开发工程师
在线考试
编程题
30分
2/2
选举游戏
Problem Description:
小东和其他小朋友正在玩一个关于选举的游戏。选举是通过投票的方式进行的,得票最多的人将获胜。
小东是编号为1的候选者,此外还有其他的候选者参加选举。根据初步的调查情况,所有准备投票的小朋友都有一定的投票倾向性,小东如果要获得胜利,必须争取部分准备为其他候选人投票的小朋友。由于小东的资源较为有限,她希望用最小的代价赢得胜利,请你帮忙计算她最少需要争取的选票数。
输入
输入有若干组,每组包含两行,第一行为一个正整数n(2<=n<=100),表示候选者的数量,第二行为每个候选人预期得到的选票数,以空格分开,每人的预期得票数在1到1000之间(包含1和1000)。
经过小东的争取后,可能出现候选人得票数为0或超过1000的情况。
输出
对每组测试数据,单独输出一行,内容为小东最少需要争取的选票数。
样例输入
5
5 1 11 2 8
4
1 8 8 8
2
7 6
样例输出
4
6
0
#include <algorithm>
#include <functional>
#include <queue>
#include <iostream>
#include <vector>
using namespace std;
int maxVot_1(vector<int>& nums) {
if (nums.size() < 2)
return 0;
int n = nums.size();
int pre = nums[0];
int vot = pre;
while (1) {
sort(nums.begin() + 1, nums.end()); //始终保持升序
if (vot <= nums[n - 1]) {
--nums[n - 1];
++vot;
}
else
break;
}
return vot - pre;
}
int maxVot_2(vector<int>& nums) {
if (nums.size() < 2)
return 0;
int pre = nums[0];
int vot = pre;
//优先队列
std::priority_queue<int> pq(nums.begin() + 1, nums.end());
while (1) {
int Max = pq.top(); //每次从最大的元素中拿出一个1
if (vot <= Max) {
pq.pop();
pq.push(--Max);
++vot;
}
else
break;
}
return vot - pre;
}
int main(void) {
while (1) {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
cout << "maxVot_1(nums) = " << maxVot_1(nums) << endl;
//cout << "maxVot_2(nums) = " << maxVot_2(nums) << endl;
}
return 0;
}