HDU 1896 Stones (Priority_queue)

来源:互联网 发布:苏州国云数据 面试难吗 编辑:程序博客网 时间:2024/05/21 15:07

【题目链接】:click here~~

【题目大意】:

就是说在一条直线道路上有n个石头,往前走,遇到一个数一个,如果遇到的是第奇数个那就把这个石头往前扔距离dis[i], 如果是第偶数个,就放置不管。
问人走到最后一个石头的位置距原地多远(遇到的最后一个石头距离出发点的位置是多少)。

【思路】模拟即可,遇到第奇数个石头,就将其加上dis[i],放回到优先队列(priority_queue)中,然后再去掉一个石头

代码:

/** Problem: HDU No.1896* Running time: 280MS* Complier: G++* Author: javaherongwei* Create Time:  14:00 2015/9/17 星期四*/#include <queue>#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;struct node{    int codr;    int dis;    bool operator <(const node t)const //小的优先级大    {       if(t.codr!=codr) return codr>t.codr;       return dis>t.dis;    }}ST;priority_queue<node> que;int main(){    int t;scanf("%d",&t);    while(t--)    {        int n;scanf("%d",&n);        while(!que.empty()) que.pop();        for(int i=1; i<=n; ++i)        {            scanf("%d %d",&ST.codr,&ST.dis);            que.push(ST);        }        int ll=1;        while(!que.empty())        {            ST=que.top();que.pop();            if(ll&1)                //将奇数的石头求和距离,每次求和完重新扔进队列中            {               ST.codr+=ST.dis;               que.push(ST);            }            ll++;        }        printf("%d\n",ST.codr);    } return 0;}


0 0
原创粉丝点击