糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 2431 Expedition 贪心+堆

思路:

有油的时候能走多远就走多远,看能否走到目的地。
如果走不到,就必须要加一次油,途中会遇到很多加油站,一定要选油最多的那个。
这很容易理解,因为如果你只加这一次,越多当然越好。如果要以后还要加,那能走远一点选择也多一点。

重复这样的过程就可以求解了。可以用堆维护加油站中的油量。

杯具:稍稍修改了一下堆的写法,结果WA两次。。

代码:
#include <stdio.h>
#include 
<stdlib.h>

#define MAX_N 10032

struct node {
    
int x, f;
}
;

struct node stop[MAX_N];
int N, L, P;
int heap[MAX_N], heap_size;

inline 
void shift_up(int idx)
{
    
int val = heap[idx];
    
while (idx > 1 && heap[idx/2< val) {
        heap[idx] 
= heap[idx/2];
        idx 
/= 2;
    }

    heap[idx] 
= val;
}


inline 
void shift_down(int idx)
{
    
int val = heap[idx];
    
while (1{
        idx 
*= 2;
        
if (idx > heap_size)
            
break;
        
if (idx + 1 <= heap_size && heap[idx + 1> heap[idx])
            idx
++;
        
if (val >= heap[idx])
            
break;
        heap[idx
/2= heap[idx];
    }

    heap[idx
/2= val;
}


int cmp(const void *a, const void *b)
{
    
return ((struct node *)b)->- ((struct node *)a)->x;
}


inline 
void push(int val)
{
    heap[
++heap_size] = val;
    shift_up(heap_size);
}


inline 
void pop()
{
    heap[
1= heap[heap_size--];
    shift_down(
1);
}


int main()
{
    
int i, x, t;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d"&N);
    
for (i = 0; i < N; i++)
        scanf(
"%d%d"&stop[i].x, &stop[i].f);
    scanf(
"%d%d"&L, &P);
    qsort(stop, N, 
sizeof(stop[0]), cmp);

    push(P);
    x 
= L;
    i 
= 0;
    
for (t = 0; heap_size && x > 0; t++{
        x 
-= heap[1];
        pop();
        
while (i < N && x <= stop[i].x)
            push(stop[i
++].f);
    }

    printf(
"%d\n", x <= 0 ? t - 1 : -1);

    
return 0;
}



posted on 2010-04-13 13:53 糯米 阅读(596) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理