善良的老师 (优先队列)

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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值