HDU 1896 【留个使用priority_queue容器的样例】

感谢《啊哈!算法》的讲解,水鸟弄懂了什么是优先队列。

题意是:在路上有很多石子,给出他们的初始位置和小明能够将他们扔出的距离,当小明遇到奇数个石子的时候就会把它扔出,遇到偶数个就会忽略他,一直走到路上没有石子为止,求解最后一个石子的位置。

一开始用排序做的,果断超时,看了题解才知道这是优先队列。

贴优先队列的代码:

#include<stdio.h>
int n;
struct st
{
    int pos,dis;
};
st stone[100010];
void swap(int a,int b)
{
    st t;
    t=stone[a];
    stone[a]=stone[b];
    stone[b]=t;
}
void siftdown(int i)
{
    int t,flag=0;
    while((i<<1)<=n&&flag==0)
    {
        if(stone[i].pos>stone[i<<1].pos||(stone[i].pos==stone[i<<1].pos&&stone[i].dis>stone[i<<1].dis))
        {
            t=i<<1;
        }
        else
            t=i;
        if((i<<1|1)<=n)
        {
            if(stone[t].pos>stone[i<<1|1].pos||(stone[t].pos==stone[i<<1|1].pos&&stone[t].dis>stone[i<<1|1].dis))
            {
                t=(i<<1|1);
            }
        }
        if(t!=i)
        {
            swap(t,i);
            i=t;
        }
        else
            flag=1;
    }
}
int main()
{
    int t,tt;
    scanf("%d",&t);
    for(tt=0;tt<t;tt++)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&stone[i].pos,&stone[i].dis);
        }
        for(int i=n/2;i>=1;i--)
        {
            siftdown(i);
        }
        int step=0;
        int ans;
        while(n>0)
        {
            step++;
            if(step&1)
            {
                stone[1].pos+=stone[1].dis;
                ans=stone[1].pos;
                siftdown(1);
            }
            else
            {
                stone[1]=stone[n];
                n--;
                siftdown(1);
            }
        }
        printf("%d\n",ans);
    }
}

然后屌丝发现c++里边有优先队列的容器:priority_queue

贴容器的使用方法(其实并不怎么懂,只是会用了):

#include<stdio.h>
#include<queue>
using namespace std;
struct st
{
    int pos,dis;
};
struct cmp
{
    bool operator()(const st &a,const st &b)
    {
        if(a.pos!=b.pos)
            return a.pos>b.pos;
        return a.dis>b.dis;
    }
};
st stone[100010];
int main()
{
    int t,tt,n;
    priority_queue<st,vector<st>,cmp>q;
    scanf("%d",&t);
    for(tt=0;tt<t;tt++)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&stone[i].pos,&stone[i].dis);
            q.push(stone[i]);
        }
        int step=0,ans;
        st ttt;
        while(!q.empty())
        {
            step++;
            ttt=q.top();
            q.pop();
            if(step&1)
            {
                ttt.pos+=ttt.dis;
                q.push(ttt);
            }
            if(q.empty()){printf("%d\n",ttt.pos);}
        }
    }
    //printf("%d\n",ans);
}
时间: 2024-10-19 15:22:13

HDU 1896 【留个使用priority_queue容器的样例】的相关文章

hdu 4941 Magical Forest (map容器)

Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 135    Accepted Submission(s): 69 Problem Description There is a forest can be seen as N * M grid. In this forest, there is so

详解C++ STL priority_queue 容器

详解C++ STL priority_queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(priority_queue\)容器的使用方法和常见的使用技巧. priority_queue容器的概念 \(priority_queue\)在英文中是优先队列的意思. 队列是一种基本的数据结构.其实现的基本示意图如下所示: 而\(C++STL\)中的优先队列就是在这个队列的基础上,把其中的元素加以排序.其内部实现是一个二叉堆.所以优先队列其实就是把堆模板化,将所有入队的元素排成具有单调性的一队

ACM~排列组合&amp;&amp;hdu样例

排列组合是数学中的一个分支,在计算机编程方面也有很多的应用,主要有排列公式和组合公式,错排公式.母函数.Catalan Number(卡特兰数)等. 一.有关组合数学的公式 1.排列公式   P(n,r)=n!/r! 2.组合公式   C(n,r)=n!/(r!*(n-r)!)  C(n,r)=C(n-1,r)+C(n-1,r-1) 3.错排公式   d[1]=0;   d[2]=1; d[n]=(n-1)*(d[n-1]+d[n-2]) 4.卡特兰数 前几项:1, 2, 5, 14, 42,

hdu 1896.Stones 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1896 题目意思:给出 n 块石头的初始位置和能到达的距离.对于第奇数次遇到的石头才抛掷,偶数次的就忽略.问最多能扔到多远.如果有多颗石头在一个位置,距离小的那个标记为先遇到的. 所以先解说一下第二个测试案例: 2 1  5 6  6 在6这个位置的时候,由于5比6小,所以规定1(5)这个点是先遇上的,是偶数次遇到,所以忽略. 用优先队列做,位置近的优先级越高,如果位置相同,距离短的优先级越高. 1

hdu 1509 &amp; hdu 1873 &amp; hdu 1896 (基础优先队列)

http://acm.hdu.edu.cn/showproblem.php?pid=1509 裸的优先队列的应用,输入PUT的时候输入名字,值和优先值进队列,输入GRT的时候输出优先值小的名字和对应的值 注意的是优先级一样的时候输出顺序在前的 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 struct point { 6 int val,odr,num;

HDU 1113 Word Amalgamation (map 容器 + string容器)

http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across the United States there is a word game called Jumble. The object of this game is to solve a riddle, but in order to find the letters that appear in th

HDU 1896 Stones (优先队列)

Problem Description Because of the wrong status of the bicycle, Sempr begin to walk east to west every morning and walk back every evening. Walking may cause a little tired, so Sempr always play some games this time. There are many stones on the road

HDU 2112 HDU Today【最短路+map容器,spfa算法+Dijkstra算法】

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25102    Accepted Submission(s): 6067 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

HDU 1896 Stones

还是优先队列 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define maxn 100010 struct Node { int x,y,id; friend bool operator < (Node a,Node b) { if(a.x != b.x) return a.x > b.x; else if