zoukankan      html  css  js  c++  java
  • hdu 1896 stones

    题目

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

  • 相关阅读:
    set转成toarray()
    list和set的拉拉扯扯的关系
    【转载】VNC和远程桌面的区别
    笔记本最小安装centos7 连接WiFi的方法
    mysql 索引优化 性能调优 锁
    PageHelper 自动去掉排序参数问题
    抽奖算法 百万次抽奖 单线程环境下 约 3.5 秒
    gitlab 安装和使用
    sharding sphere 分表分库 读写分离
    mycat 安装 分表 分库 读写分离
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160265.html
Copyright © 2011-2022 走看看