【UESTC 482】Charitable Exchange(优先队列+bfs)

给你n个物品交换,每个交换用r,v,t描述,代表需要用r元的东西花费t时间交换得v元的东西。一开始只有1元的东西,让你求出交换到价值至少为m的最少时间代价。
相当于每个交换是一条边,时间为边权,求走到价值大于等于m的点的最短路径。
bfs的时候,用优先队列来储存状态,每次取出花费总时间最小的状态。

#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;

struct node{
    int r,v;
    ll t;
}a[100005];

int n,m,cas;

int cmp(const node a, const node b){
    return a.r<b.r;
}

struct cmp2{
    bool operator ()(const node a, const node b)
    {
        return a.t>b.t;
    }
};

priority_queue<node, vector<node>, cmp2>q;

ll bfs(){
    int l=1,i;
    q.push((node){0,1,0});

    while(!q.empty()){
        node s=q.top();
        q.pop();

        if(s.v>=m)
            return s.t;

        for(i=l;i<=n;i++){
            if(s.v>=a[i].r&&s.v<a[i].v)
                q.push((node){0,a[i].v,s.t+a[i].t});
            if(s.v<a[i].r)
                break;
        }

        l=i;
    }
    return -1;
}

int main(){
    scanf("%d",&cas);
    for(int c=1;c<=cas;c++){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&a[i].v,&a[i].r,&a[i].t);

        while(!q.empty())q.pop();
        sort(a+1,a+1+n,cmp);

        printf("Case #%d: %lld\n",c,bfs());
    }
    return 0;
}

  

时间: 2024-10-06 06:41:14

【UESTC 482】Charitable Exchange(优先队列+bfs)的相关文章

CDOJ 482 Charitable Exchange bfs

Charitable Exchange Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/482 Description Have you ever heard a star charity show called Charitable Exchange? In this show, a famous star starts with a small item which val

cdoj 482 优先队列+bfs

Charitable Exchange Time Limit: 4000/2000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status Have you ever heard a star charity show called Charitable Exchange? In this show, a famous star starts with a small item which value

HDU 1242 Rescue(优先队列+bfs)

题目地址:HDU 1242 这个题相比于普通的bfs有个特殊的地方,经过士兵时会额外消耗时间,也就是说此时最先搜到的时候不一定是用时最短的了.需要全部搜一遍才可以.这时候优先队列的好处就显现出来了.利用优先队列,可以让队列中的元素按时间排序,让先出来的总是时间短的,这样的话,最先搜到的一定是时间短的,就不用全部搜一遍了.PS:我是为了学优先队列做的这题..不是为了这题而现学的优先队列.. 代码如下: #include <iostream> #include <stdio.h> #i

Ignatius and the Princess I (hdu 1026 优先队列+bfs+输出路径)

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

POJ 2312 Battle City(优先队列+BFS)

题目链接:http://poj.org/problem?id=2312 Battle City Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7085   Accepted: 2390 Description Many of us had played the game "Battle city" in our childhood, and some people (like me) even often pl

poj 2251 Dungeon Master(优先队列bfs)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20867   Accepted: 8090 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled

hdu 5040 优先队列BFS+剪枝

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

hdu 1242 rescue (优先队列 bfs)

题意: 公主被关在 a位置 她的朋友在r位置 路上x位置有恶魔 遇上恶魔花费2 时间 否在时间花费 1 时间 问 最短多少时间 找到公主 思路: bfs+ 优先队列(时间短的先出列) #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<iostream> #include<algorithm> using namespace std;

hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)

以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要花费1s+数字大小的时间. 比较麻烦的是需要记录路径.还要记录是在走路还是在打怪. 因为求最短路,所以可以使用bfs. 因为进过每一个点花费时间不同,所以可以使用优先队列. 因为需要记录路径,所以需要开一个数组,来记录经过节点的父节点.当然,记录方法不止一种. 上代码—— 1 #include <c