Description
第八届厦门理工学院程序设计大赛即将到来,Saya被要求给学弟们出一套题目。一套题目要求包含n道题,每道题都有一个难度值,难度值必须是正整数,且为了保证比赛的区分度,不能有某两道题的难度值是相同的。Saya在比赛前一天终于出了一套符合要求的题目,谢老师看了一下这套题的难度,仁慈的他觉得这套题的难度太高了,但是他又没有时间再重新出,所以他决定对这n道题进行调整。
每次他可以选择一道题进行调整,将这道题的难度值降为原来的一半(若为小数则向下取整)。他可以进行任意次这样的调整(一道题也可以调整多次),使得调整完后n道题中难度最大的那道题难度尽量小,当然前提是要先保证调整后的题目难度值必须是正整数,且不能有某两道题的难度值是相同的。
谢老师希望聪明的你能告诉他,经过调整后,满足要求的难度值最大的那道题的难度值最小是多少。
Input
第一行包括一个整数N( 2 <= N <= 20000 )。 接下来一行N个数字,每个数字ai( 0 <= ai <= 100000 )表示每道题的难度值,输入保证ai各不相同。
Output
输出一个整数,表示满足条件的最小答案。
Sample Input
6
9 7 13 17 5 11
Sample Output
6
思路:
先对题的难度从大到小排一遍,取难度最大的题降低难度(难度值不能相同,用标记法解决)。
然后新的题目里,又有一个新的最大难度的题,继续取难度最大的题降低难度。
当难度最大的题无法继续降低难度,即为解。
#include <iostream>
#include <queue>
using namespace std;
int v[100005], t, a, k;
priority_queue<int> q;
int main() {
cin >> t;
while(t--) {
cin >> a;
v[a] = 1;
q.push(a);
}
while(1) {
k = q.top();
while(k != 0 && v[k]) k /= 2;
if(k == 0) break;
q.pop();
q.push(k);
v[k] = 1;
}
cout << q.top() << endl;
return 0;
}