您的位置:首页 > 产品设计 > UI/UE

HDU 1896 Stones (Priority_queue)

2015-09-17 14:36 507 查看
【题目链接】: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: