hdu 1896 stones

来源:互联网 发布:网络奇谈 恐惧鸟 txt 编辑:程序博客网 时间:2024/06/06 19:52

题目

遇到第奇数块石头时,他会将其往前面扔,能扔多远在输入中会给出,而遇到第偶数个石头时不进行处理。当有两个石头在同一位置时,则先处理"射程"(能扔的距离最短)的石头,然后Sempr一直往前走,直到前面已经没有任何石头时,这时候计算Sempr与出发点的距离。

样例解析:

对于样例1的分析:一开始的时候遇到的是第一个石头,他的坐标是1,然后往前扔了5个单位之后,坐标变成6,随后继续往前走,开始遇到第二个石头(坐标是2),忽略,然后继续往前走,又遇到了原来的第一个石头(现在是第三个石头),但是它此时坐标为6,往前扔了5个单位之后,坐标变成11,然后继续往前走,一直走在坐标11时,这时候他遇到的是第四个石头,因此忽略不计。至此,前面已经没有石头了,因此此时离坐标原点的距离为11。

解题思路:

因此有了以上的分析,我们可以运用优先队列解决上述问题,先将每个石头的位置及其能够扔的距离封装成一个结构体,然后再根据小根堆的思想重载
优先队列的优先级即可。利用一个bool变量来控制奇偶,奇数时处理,偶数时不处理。

#include<cstdio>#include<algorithm>#include<queue>using namespace std;struct Node{    int pos;    int dis;      //表示能够扔的距离    friend bool operator <(Node a,Node b){           if(a.pos==b.pos){            return a.dis > b.dis;        }        return a.pos > b.pos;  //从小到大排    }};int main(){    int T,N;    int P,D;    scanf("%d",&T);    while(T--){        priority_queue <Node> que;        Node node;        scanf("%d",&N);        for(int i = 1;i <= N;++i){            scanf("%d %d",&node.pos,&node.dis);            que.push(node);        }        bool tmp = true;    //用于切换奇偶        while(!que.empty()){            node = que.top();            que.pop();            if(tmp){                node.pos += node.dis;                que.push(node);       //将扔到远方的石头继续加入队列中            }            tmp = !tmp;        //偶数个不处理        }        printf("%d\n",node.pos);    }    return 0;}

这道题用了运算符重载,这是第一次试着去把它搞懂,之前看的那个博客用的是class A {public: ……}的方法,但是看不懂,之后看到有用struct A{  ……};写的,结果把之前那个改了,发现也可以。

下面这链接说了,class 与 struct 的区别:

http://blog.csdn.net/fefe82/article/details/37730545

支持运算符重载和定义新运算符的语言:
PostgreSQL的SQL方言
Ruby
Haskell
支持运算符重载的语言:
Ada
C++
C#
D
Perl
Python
Pico(某种程度上)
Pascal(仅Free Pascal Dialect)
FreeBASIC
Visual Basic(需要 Visual Basic .NET 2008 或更高版本)
不支持运算符重载的语言:
C
Delphi
Java
Objective-C