HDU 4546 优先队列

用优先队列BFS一遍即可,

每个节点分别记录 当前难度,加上下一个以后的难度,和下一个为哪道题

队列优先弹出加上下一个以后难度最小的

#include "stdio.h"
#include "string.h"
#include "algorithm"
#include "queue"
using namespace std;

struct node
{
    int now,next,id;
    bool friend operator<(node n1,node n2)
    {
        return n2.next<n1.next;
    }
};
int a[10010],n,m;
void bfs()
{
    int i,cnt;
    priority_queue<node>q;
    node cur,next;

    scanf("%d%d",&n,&m);
    for (i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,a+n);

    cur.now=0;
    cur.next=a[0];
    cur.id=0;
    q.push(cur);
    cnt=0;
    while (cnt<m)
    {
        cur=q.top();
        q.pop();
        if (cur.id>=n) continue;
        next.now=cur.now;
        next.next=cur.now+a[cur.id+1];
        next.id=cur.id+1;
        q.push(next);

        next.now=cur.next;
        next.next=cur.next+a[cur.id+1];
        next.id=cur.id+1;
        q.push(next);
        cnt++;
    }

    for (i=0;!q.empty();i++)
    {
        a[i]=q.top().now;
        q.pop();
    }
    sort(a,a+m);
    printf("%d\n",a[m-1]);
}
int main()
{
    int Case,i;
    scanf("%d",&Case);
    for (i=1;i<=Case;i++)
    {
        printf("Case #%d: ",i);
        bfs();
    }
    return 0;

}
时间: 2024-11-11 08:41:12

HDU 4546 优先队列的相关文章

HDU 4546 比赛难度(优先队列)

HDU 4546 比赛难度 题目链接 思路:由于m不是很大,如果用一个优先队列维护,如果每次能保证加入的值是最小的,那么只需要加入m次就能完成了,时间复杂度足够,那么如何保证呢,就把数列排序,维护优先队列为当前和加下一个位置和的最小值,每次一个出队,把下一个位置取于不取在入队,最后求出答案即可 代码: #include <cstdio> #include <cstring> #include <queue> #include <algorithm> usin

HDU 5700 优先队列(或者multiset) 或 线段树

题目大意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大.数列的数字均>=0 优先队列思路: 按照左端点sort,然后枚举左端点,假设他被覆盖过k次,然后用优先队列来维护最右端即可. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace std; #pragma comment(linker,"/STACK:102400000,102400000&qu

HDU 1058 优先队列or堆

本来应当是一道优先队列或者堆的题 因为每个数都应该是已经得到的数*2 *3 *5 *7而得到的 但是 2*7 大于 3*2 这就必须保证每次取得都是没有拿过的最小的数 但是它主动降低难度在样例里卖了个萌 n的范围是1~5842 而第5842在样例里给出了..所以我们在取出一个数 求出它的*2 *3 *5 *7的时候做一下判断 如果大于最后一位就直接break 因为相乘的顺序在 可以省一点时间 在判断某个数是否出现过的时候 开不出那么大的vis数组 所以直接for循环从ans数组中寻找 所幸没有超

hdu 5040 优先队列BFS+剪枝

(北京网络赛09题)题意:给一矩阵(图),里面有起点,终点,还有探照灯(每个有初始朝向,每秒顺时针转90度),前面有灯或者自己被灯照着,移动就要花3秒,求起点到终点最短时间. 用一个数组三维数组记录一下,用来当前位置当前时间%4有没有灯,然后优先队列(时间短的在前面),搜索即可.考虑到可以来回走或者原地等,不能简单判重剪枝:每个地方最多是4种状态!就是4秒之后就全图状态回到一样!所以若当前状态(时间%4)下来过就不用来了. #include<iostream> #include<vect

HDU 3619 优先队列+状压+bfs

Heroes of Might and Magic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 170    Accepted Submission(s): 74 Problem Description After a very long journey and uncountable number of uphill battles

HDU 4006 优先队列

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 10390    Accepted Submission(s): 4153 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

hdu 5818 (优先队列) Joint Stacks

题目:这里 题意: 两个类似于栈的列表,栈a和栈b,n个操作,push a x表示把数x放进a栈的栈底,pop b 表示将栈b的栈顶元素取出输出,并释放这个栈顶元素,merge a b表示把后面的那个 栈里的元素全部压进前面的那个栈里面,并且压入后前面的栈的所有元素按其进栈顺序排列然后后面的栈变为了空. push和pop操作都还好,就是优先队列或者栈的操作,主要是merge操作,如果啊按照题目来模拟每次将后面的栈元素取出放入前面的栈,可能会超时,而超时的主要因素是每次都将 元素多的栈压入了元素少

hdu 1026(优先队列+路径输出)

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17171    Accepted Submission(s): 5495Special Judge Problem Description The Princess has been abducted by the BEelzebub

hdu 4544 优先队列+贪心

题意:最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏.游戏规则很简单,用箭杀死免子即可.箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di(1 <= i <= M),每种箭需要一定的QQ币购买.假设每种箭只能使用一次,每只免子也只能被射一次,请计算要消灭地图上的所有兔子最少需要的QQ币. 链接:点我 贪心在能杀死某个兔子的箭里选择价格最小的 一开始直接两个for,tle,看了别人代码之后才知道用优先队列 1 #include<