HDU4546-优先队列|搜索-比赛难度

acm.hdu.edu.cn/showproblem.php?pid=4546
中文题意。
HDU4546-优先队列|搜索-比赛难度_第1张图片
给定m个数,求这m个数组成的集合中第k小的数是多少。
首先,暴力这么多集合是不可行的,
可以从空集开始,维护一个集合,其结果由集合中最大的一个数和 其他数构成的前缀组成
那么在生成集合的过程中,有两种操作。1 抛弃其他数。最大那个数为总和,2 往后累加更大的。(见图示,图中a

#include 
using namespace std;
const int maxn=10008;
int a[maxn];
int m,k;
struct Node{
      int sum;
      int next;
      friend bool operator<(Node b1,Node b2)
     {
       return b1.sum+a[b1.next]>b2.sum+a[b2.next];    //x小的优先级高。
     }
     Node(){};
     Node(int _a,int _b){sum=_a;next=_b;};
};
int main(){
    int t;
    scanf("%d",&t);
   for(int cas=1;cas<=t;cas++)
   {
          scanf("%d%d",&m,&k);
          for(int i=1;i<=m;i++){
              scanf("%d",&a[i]);
          }
          sort(a+1,a+m+1);
          priority_queueq;
          while(!q.empty()) q.pop();
          q.push(Node(0,1));
          int tmp;
          for(int i=1;i<=k;i++){
                Node u=q.top();
                q.pop();
                 tmp=u.sum+a[u.next];
                u.next++;
                //cout<<":"<":"<next-1<if(u.next<=m){
                     q.push(Node(u.sum,u.next));
                     u.sum=tmp;
                     q.push(u);
                 }

          }
          printf("Case #%d: %d\n",cas,tmp);
    }
    return 0;
}

你可能感兴趣的:(STL,搜索)