Expedition---poj2431(优先队列-堆)

题目链接:http://poj.org/problem?id=2431

题意:一辆卡车需要行驶 L 距离,车上油的含量为 P,在行驶的过程中有 n 个加油站

#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define N 11000
#define INF 0x3f3f3f3f
using namespace std;

int Max_Heap[N], K;///K代表Max_Heap的个数;
int p;

void Push(int x)///在最大堆中插入x;
{
    Max_Heap[K++] = x;///放到最后一个节点处;

    int t = K-1;

    while(Max_Heap[t] > Max_Heap[t/2] )///当它的值大于它的父节点的值时,要交换一下位置;
    {
        swap(Max_Heap[t], Max_Heap[t/2]);
        t = t/2;
    }
}
void Pop()
{
    K --;///删除元素,堆中总个数减一;

    Max_Heap[1] = Max_Heap[K];///把最后一个数放到最上面,然后一步一步往下更新堆;

    Max_Heap[K] = -1;///防止越界,相当于建立哨兵;

    int t = 1;///从第一个节点开始往下更新;

    while( Max_Heap[t] < Max_Heap[t*2] || Max_Heap[t] < Max_Heap[t*2+1])
    {
        if(Max_Heap[t] < Max_Heap[t*2] && Max_Heap[t*2] > Max_Heap[t*2+1])
        {///左儿子大于它时,并且满足左儿子大于右儿子,让左儿子上去;
            swap(Max_Heap[t], Max_Heap[t*2]);
            t = t*2;
        }
        else
        {
            swap(Max_Heap[t], Max_Heap[t*2+1]);
            t = t*2 + 1;
        }
    }
}

int n, P, L, ans, f;

struct node
{
    int a,b;
} s[N];

int cmp(node n1,node n2)
{
    return n1.a<n2.a;
}

void slove()
{
    memset(Max_Heap, -1, sizeof(Max_Heap));

    Max_Heap[0] = INF;

    K = 1;

    int pos = 0, i = 0;

    while(i <= n)
    {
        int d = s[i].a - pos;

        while(K!=1 && P < d)
        {
            int p = Max_Heap[1];
            Pop();
            P += p;
            ans ++;
        }
        if(P >= d)
        {
            Push(s[i].b);
            pos = s[i].a;
            P -= d;
        }
        else
        {
            ans = -1;
            return ;
        }
        i ++;
    }
}

int main()
{
    int i;

    while(scanf("%d",&n) != EOF)
    {
        memset(s, 0, sizeof(s));

        ans=0;

        for(i=0; i<n; i++)
            scanf("%d %d",&s[i].a, &s[i].b);

        scanf("%d %d", &L, &P);

        for(i=0; i<n; i++)
            s[i].a = L - s[i].a;

        s[i].a = L;
        s[i].b = 0;

        sort(s, s+n+1, cmp);

        slove();

        printf("%d\n", ans);
    }
    return 0;
}

时间: 2024-10-09 07:33:28

Expedition---poj2431(优先队列-堆)的相关文章

优先队列(堆)

优先队列(priority queue)是允许至少两种操作的数据结构:Insert及DeleteMin(删除最小者).相当于队列中的Enqueue.Dequeue操作. 优先队列可以用链表.二叉查找树.二叉堆等实现. 二叉堆 1. 结构性质 堆(heap)是一棵完全被填满的二叉树,有可能的例外是在底层,底层上的元素从左向右填入.这样的树称之为完全二叉树. 一棵高为h的完全二叉树有2h到2h+1-1个节点.完全二叉树的高为logN. 完全二叉树可以用数组来表示,如果从0开始,对于数组中任意i位置的

poj2431 Expedition (优先队列) 挑战程序设计竞赛

题目链接:http://poj.org/problem?id=2431 Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9148   Accepted: 2673 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor driver

POJ2431 Expedition(排序+优先队列)

思路:先把加油站按升序排列. 在经过加油站时,往优先队列里加入B[i].(每经过一个加油站时,预存储一下油量) 当油箱空时:1.如果队列为空(可以理解成预存储的油量),则无法到达下一个加油站,更无法到达目的地. 2.否则就取出队列里的最大元素,来给汽车加油(贪心思想) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue>

【POJ - 2431】Expedition(优先队列)

Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离泄漏一个燃料单位. 为了修理卡车,奶牛需要沿着一条蜿蜒的长路行驶到最近的城镇(距离不超过1,000,000个单位).在这条路上,在城镇和卡车的当前位置之间,有N(1 <= N <= 10,000)燃料站,奶牛可以停下来获得额外的燃料(每站1..100个单位). 丛林对人类来说是一个危险的地方,对奶

优先队列(堆)&#183;二项队列

目录 一. 定义 二. 结构 三. 操作 3.1. 合并 3.1. 删除最小值(deleteMin) 四. 二项队列的实现 代码地址 一. 定义 ? 我们知道,左式堆每次操作的时间界是\(O(logN)\).二项队列支持合并.插入.删除最小值,每次插入的平均时间为常数时间,而最坏时间是\(O(logN)\). ? 二项队列: 不是一棵堆序的树,而是堆序的树的集合,成为森林. 森林的每棵树都是二项树(binomial tree). 每个高度上至多存在一棵二项树. 二. 结构 ? 结构图解: ? 高

stl 优先队列(堆)

[模板]堆 题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: 第一行包含一个整数N,表示操作的个数 接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下: 操作1: 1 x 操作2: 2 操作3: 3 输出格式: 包含若干行正整数,每行依次对应一个操作2的结果. 输入输出样例 输入样例#1: 5 1 2 1 5 2 3 2 输出样例#1:

poj2431优先队列

A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock and puncture the truck's fuel tank. The truck now leaks one unit of fuel every unit of di

优先队列(堆)的实现

堆的插入/删除/打印操作 #include<iostream> #include<vector> #include<math.h> using namespace std; //堆的插入 vector<int> insert(int x,vector<int> heap) { int temp; if(heap.empty()) { heap.push_back(x); } else { heap.push_back(x); for(int i=

Expedition(优先队列)

Expedition 点我 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9465   Accepted: 2760 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed

poj 2431 Expedition 贪心+优先队列

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7707   Accepted: 2263 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to