积木高楼
时间限制:1秒 内存限制:128M
题目描述
小可有 n 栋积木高楼,编号从 1 到 n,其中第 i 个积木高楼由 aiai 块积木构成。
如果积木高楼满足 ai>ajai>aj ,则小可可以从 ii 拿一块积木放到 jj 。
进行任意次上述移动操作之后,a1a1 最大会是多大。
输入描述
第一行:输入一个正整数 t ,表示多组输入的测试样例数。
对于每组数据:
第一行:输入一个正整数 n ,表示积木高楼的数量。
第二行:输入 n 个正整数 aiai ,表示每个积木高楼由多少积木构成。
输出描述
对于每组数据,输出最大的 a1a1
输入样例
4
3
1 2 3
3
1 2 2
2
1 1000000000
10
3 8 6 7 4 1 2 4 10 1
输出样例
3
2
500000001
9
数据描述
25%的数据下:1≤t≤2,1≤n≤100
100%的数据下:1≤t≤10^4,2≤n≤2×10^5,1≤ai≤10^9 1≤t≤10^4,2≤n≤2×10^5,1≤ai≤10^9 且多组输入的 n 的和不超过 2×10……5
#include<iostream>
#include<queue>
using namespace std;
const int N = 2*1e5+5;
long long n,a[N],t;
priority_queue<long long ,vector<long long>,greater<long long> >q;
int main(){
// freopen("building.in","r",stdin);
// freopen("building.out","w",stdout);scanf("%lld",&t);while(t--){scanf("%lld",&n);scanf("%lld",&a[1]);for(int i=2;i<=n;i++) scanf("%lld",&a[i]),q.push(a[i]);while(q.size()>0){if(q.top()<=a[1]) q.pop();else{int sum=(q.top()+a[1]);a[1]=(sum+1)/2;q.pop();}}printf("%lld\n",a[1]);}return 0;
}