首页 > 其他分享 >HDU4546(优先队列)

HDU4546(优先队列)

时间:2023-05-31 17:33:09浏览次数:31  
标签:tmp Node 优先 ith 队列 sum next int HDU4546


题目:比赛难度

 

题意:给一个整数序列,长度为n,求在这个序列的子序列中和为第m大的数。

 

分析:

设置优先级队列

{
    sum:   当前和
    next:  加入下个元素的和
    ith:   将要考虑的下个元素
}

以next为优先级,小的先出队

读入数据后排序,初始化队列第一个元素(0,a[0],0)

每次出队一个元素,入队(sum,sum+a[ith],ith+1),(next,next+a[ith],ith+1),即是否加上a[ith]都考虑进去了。

这样每次新加入的元素都是下一个最小的(next),进行m次就得到了第m小。

 

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <queue>

using namespace std;
const int N=100011;

int a[N];
int n,m;

struct Node
{
    int sum;
    int next;
    int ith;
    Node(){};
    Node(int _sum,int _next,int _ith)
    {
        sum=_sum;
        next=_next;
        ith=_ith;
    }
    bool operator < (const Node &b) const
    {
        return b.next<next;
    }
};

int Solve(int m)
{
    priority_queue<Node> Q;
    Node tmp;
    tmp.sum=0;
    tmp.next=a[0];
    tmp.ith=0;
    Q.push(tmp);
    int cnt=0;
    a[n]=0;
    while(cnt<m)
    {
        tmp=Q.top();
        Q.pop();
        if(tmp.ith>=n) continue;
        Q.push(Node(tmp.sum,tmp.sum+a[tmp.ith+1],tmp.ith+1));
        Q.push(Node(tmp.next,tmp.next+a[tmp.ith+1],tmp.ith+1));
        cnt++;
    }
    for(m=0;!Q.empty();m++)
    {
        a[m]=Q.top().sum;
        Q.pop();
    }
    sort(a,a+m);
    return a[m-1];
}

int main()
{
    int t,i,tt=1;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);
        printf("Case #%d: %d\n",tt++,Solve(m));
    }
    return 0;
}

 

标签:tmp,Node,优先,ith,队列,sum,next,int,HDU4546
From: https://blog.51cto.com/u_16146153/6388679

相关文章

  • 用POSIX线程库创建带优先级的线程
    #include<iostream>#include<pthread.h>void*threadFunction(void*arg){//线程函数逻辑//...returnnullptr;}intmain(){pthread_tthread;pthread_attr_tattr;//初始化线程属性pthread_attr_init(&attr);//......
  • java轻型内存队列处理demo
    java轻型内存队列处理demo@ComponentpublicclassConcurrentLinkedQueueUtils{staticAtpLogBizatpLogBiz;staticAuditLogtTmpDataServiceauditLogDataService;staticConcurrentLinkedQueueconList=newConcurrentLinkedQueue();privatestaticvo......
  • python deque的内在实现 本质上就是双向链表所以用于stack、队列非常方便
    Howcollections.dequeworks?Cosven  前言:在Python生态中,我们经常使用collections.deque来实现栈、队列这些只需要进行头尾操作的数据结构,它的append/pop操作都是O(1)时间复杂度。list的pop(0)的时间复杂度是O(n),在这个场景中,它的效率没有deque高。那deque内部......
  • Java并发(七)----线程sleep、yield、线程优先级
    1、sleep与yieldsleep调用sleep会让当前线程从Running进入TimedWaiting状态(阻塞)其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException睡眠结束后的线程未必会立刻得到执行建议用TimeUnit的sleep代替Thread......
  • [转]C#阻塞队列BlockingCollection
    BlockingCollection是一个比较冷门的类,我们先看下官方对这个类的定义:简单来说,BlockingCollection就是一个线程安全的阻塞队列,利用阻塞这个特性,我们可以实现进程内的生产者-消费者模式,比如消息转发、日志记录等。下面我们看一个例子,其用来实现消息转发,先定义一个MessageDis......
  • 堆栈模拟队列 (25分)
    堆栈模拟队列(25分)设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:intIsFull(StackS):判断堆栈S是否已满,返回1或0;intIsEmpty(StackS):判断堆栈S是否为空,返回1或0;voidPush(StackS,ElementTypeitem):将......
  • docker rabbitMQ 安装延时队列插件
    1下载插件到容器内在这个网站上找到插件的下载链接容器内wget或使用dockercp复制到容器内dockercp/rabbitmq_delayed_message_exchange-3.8.0.ezrabbit:/plugins2启用插件#进入容器启用插件dockerexec-itrabbit/bin/bashrabbitmq-pluginsenablera......
  • 单调队列
    以求滑动窗口内最小值为例:有2314785一组数据,有一个范围为3的的滑动窗口,每次向右移动1距离,求每次滑动的最小值队列特性维护一个最大为3个数的队列,且该队列具有单调性(队列内的数据呈现单调递增或递减)元素进队只能从队尾进,队头,队尾都可出从尾进队:是必......
  • 网工内推 | 快手、瑞芯微招运维,思科、红帽认证优先
    01快手招聘岗位:IT系统运维职责描述:1、负责IT基础架构运维体系的建设和优化改进;2、负责IT核心基础服务(如DNS、负载均衡、容器)的架构设计、平台建设和运维;3、负责IT内部日志系统、监控系统、报警系统的建设与运维相关工作;4、负责相关项目建设,与相关部门共同制定具体落地方案及应对计......
  • 实现延迟队列
    原理:利用消息过期后消息进入死信,然后消费者订阅死信队列进行消费达到延迟的功能 生产者-->交换机01-->过期队列-->消息过期后-->死信交换机-->死行队列-->消费者 定义配置@ConfigurationpublicclassTTLQueueConfig{//region声明普通类型的交换机和队列pu......