且未

博客园 首页 新随笔 联系 订阅 管理

题目

遇到第奇数块石头时,他会将其往前面扔,能扔多远在输入中会给出,而遇到第偶数个石头时不进行处理。当有两个石头在同一位置时,则先处理"射程"(能扔的距离最短)的石头,然后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

posted on 2017-10-21 14:59  阿聊  阅读(149)  评论(0编辑  收藏  举报