题目描述
给出一个长度为 N 的非负整数序列 A_i ,对于所有 1 ≤ k ≤ (N + 1) / 2 ,输出 A_1, A_3, …, A_{2k - 1}的中位数。即前 1,3,5,…个数的中位数。
输入输出格式
输入格式:
第 1 行为一个正整数 N ,表示了序列长度。
第 2 行包含 N 个非负整数 A_i (A_i ≤ 10^9) 。
输出格式:
共(N + 1) / 2行,第 i 行为 A_1, A_3, …, A_{2k - 1}的中位数。
输入输出样例
说明
对于 20% 的数据, N ≤ 100;
对于 40% 的数据, N ≤ 3000;
对于 100% 的数据, N ≤ 100000。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 int n,a[100001]; 6 int main(){ 7 // freopen("std.in","r",stdin); 8 // freopen("stdt.out","w",stdout); 9 scanf("%d",&n); 10 for(int i=1;i<=n;i++) 11 scanf("%d",&a[i]); 12 for(int i=1;i<=n/2+n%2;i++){ 13 sort(a+1,a+i*2); 14 printf("%d ",a[i]); 15 } 16 // fclose(stdin); 17 // fclose(stdout); 18 return 0; 19 }
1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<vector> 5 int n,a,b,m; 6 std::priority_queue<int> vis; 7 std::priority_queue<int,std::vector<int>,std::greater<int> > dis; 8 int main() { 9 scanf("%d%d",&n,&m); 10 printf("%d ",m); 11 vis.push(m); 12 for(int i=1; i<=(n-1)/2; i++) { 13 scanf("%d%d",&a,&b); 14 if(a>=m) dis.push(a); else vis.push(a); 15 if(b>=m) dis.push(b); else vis.push(b); 16 while(vis.size()>=dis.size()) { dis.push(vis.top()); vis.pop(); } 17 while(dis.size()>vis.size()+1) { vis.push(dis.top()); dis.pop(); } 18 m=dis.top(); 19 printf("%d ",m); 20 } 21 return 0; 22 }
善用queue,大小根堆
明明看到了也不回复,你不知道我的心碎。