善良的老师 (优先队列)

来源:互联网 发布:2011年网络男歌手 编辑:程序博客网 时间:2024/05/24 00:58

Description

第八届厦门理工学院程序设计大赛即将到来,Saya被要求给学弟们出一套题目。一套题目要求包含n道题,每道题都有一个难度值,难度值必须是正整数,且为了保证比赛的区分度,不能有某两道题的难度值是相同的。Saya在比赛前一天终于出了一套符合要求的题目,谢老师看了一下这套题的难度,仁慈的他觉得这套题的难度太高了,但是他又没有时间再重新出,所以他决定对这n道题进行调整。 
每次他可以选择一道题进行调整,将这道题的难度值降为原来的一半(若为小数则向下取整)。他可以进行任意次这样的调整(一道题也可以调整多次),使得调整完后n道题中难度最大的那道题难度尽量小,当然前提是要先保证调整后的题目难度值必须是正整数,且不能有某两道题的难度值是相同的。 
谢老师希望聪明的你能告诉他,经过调整后,满足要求的难度值最大的那道题的难度值最小是多少。 

Input

第一行包括一个整数N( 2 <= N <= 20000 )。 接下来一行N个数字,每个数字ai( 0 <= ai <= 100000 )表示每道题的难度值,输入保证ai各不相同。

Output

输出一个整数,表示满足条件的最小答案。

Sample Input

69 7 13 17 5 11

Sample Output

6


思路:

先对题的难度从大到小排一遍,取难度最大的题降低难度(难度值不能相同,用标记法解决)

然后新的题目里,又有一个新的最大难度的题,继续取难度最大的题降低难度。

当难度最大的题无法继续降低难度,即为解。

#include <cstdio>#include <algorithm>#include <queue>using namespace  std;int a[20005];int b[100005];int N,i,first;int main(){priority_queue<int>q;       scanf("%d",&N);for(i=0;i<N;i++){scanf("%d",&a[i]);q.push(a[i]);b[a[i]]=1;}while(1){first=q.top();while(first != 0){first=first/2;if(first ==0) break;if(b[first]==0){q.push(first);q.pop();b[first]=1;break;}}if(first == 0)break;}printf("%d\n",q.top());return 0;}