zoukankan      html  css  js  c++  java
  • NYOJ 634 万里挑一(优先队列)

     //题目链接
    //http://acm.nyist.net/JudgeOnline/problem.php?pid=634
    1
    #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 int a[100001], b[100001]; 7 struct node{ 8 int d; int b; 9 node(){} 10 node(int a, int b):d(a),b(b){} 11 bool operator < (const node& tmp) const{ 12 return d < tmp.d; //使队列维护从大到小的性质 13 } 14 }; 15 bool cmp(int ta, int tb){ 16 return ta > tb; 17 } 18 void merge(int *A, int *B, int *C, int n){ 19 priority_queue<node> pq; 20 int i; 21 for(i = 0; i < n; ++i) 22 pq.push(node(A[i] + B[0], 0)); //先入队列n个数(第一个是最大的) 23 for(i = 0; i < n; ++i){ 24 node tmp = pq.top(); pq.pop(); //每次最大的数出队列,并保存到数组C中 25 C[i] = tmp.d; 26 int b = tmp.b; 27 if(b + 1 < n) 28 pq.push(node(tmp.d - B[b] + B[b+1], b+1)); 29 //tmp.d = A[x] + B[b]; 30 //tmp.d - B[b] + B[b+1] 是小于等于tmp.d的一个数入队 31 } 32 } 33 int main() 34 { 35 int N, k, i; 36 while(scanf("%d%d",&N, &k) != EOF){ 37 for(i = 0; i < N; ++i) scanf("%d", &a[i]); 38 for(i = 0; i < N; ++i) scanf("%d", &b[i]); 39 sort(a, a+N, cmp); //从大到小排序 40 sort(b, b+N, cmp); 41 merge(a, b, a, k); 42 printf("%d", a[k-1]); 43 for(i = k-2; i >= 0; --i) 44 printf(" %d", a[i]); 45 puts(""); 46 } 47 return 0; 48 }
  • 相关阅读:
    “王者对战”之 MySQL 8 vs PostgreSQL 10
    PostgreSQL 进程结构
    Linux core dump 诊断进程奔溃退出
    linux下core dump--转载
    2.4 等比数列
    2.3 等差数列的前n项和
    2.2 等差数列
    1.1.1 三角形正弦定理
    调整颜色
    去括号法则
  • 原文地址:https://www.cnblogs.com/yaling/p/3193545.html
Copyright © 2011-2022 走看看