• Stones


    题目是:HDU1896

    题目简述:输入一堆石头,每个石头有自己所在的位置p,以及自己可以抛多远的距离d。你每遇到第奇数个石头,就把石头丢出去,第偶数个石头就不管。计算出最后一个石头它所处的位置。

    解法:该题我采取的是先用优先队列对石头进行排序,然后再对每个石头进行处理,奇数石头就计算出石头的新位置在插进队列去,偶数石头就删除,最后所剩的石头的位置就是所求的位置。

    Σ( ̄。 ̄ノ)ノ很久没敲代码。。。。优先队列都快忘记怎么写了。。。。复习一下:优先队列

    头文件:

    #include <queue>

    基本操作:

    empty()       如果队列为空返回真

    pop()           删除对顶元素

    size()           返回优先队列中拥有的元素个数

    top()            返回优先队列对顶元素

    在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。

    声明方式:

    1、普通方法:

    priority_queue<int>q;
    //通过操作,按照元素从大到小的顺序出队

    2、自定义优先级:

    struct cmp
    {
    operator bool ()(int x, int y)
    {
    return x > y; // x小的优先级高
    //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
    }
    };
    priority_queue<int, vector<int>, cmp>q;//定义方法
    //其中,第二个参数为容器类型。第三个参数为比较函数。
     

    3、结构体声明方式:

    struct node
    {
    int x, y;
    friend bool operator < (node a, node b)
    {
    return a.x > b.x; //结构体中,x小的优先级高
    }
    };
    priority_queue<node>q;//定义方法
    //在该结构中,y为值, x为优先级。
    //通过自定义operator<操作符来比较元素中的优先级。
    //在重载”<”时,最好不要重载”>”,可能会发生编译错误
     
    代码如下:
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <queue>
     4 using namespace std;
     5 
     6 struct node
     7 {
     8     friend bool operator < (node n1,node n2)
     9     {
    10         if(n1.p!=n2.p)    return n1.p>n2.p;
    11         else  return n1.d>n2.d;
    12     }
    13     int p,d;
    14 };
    15 
    16 priority_queue<node> q;
    17 
    18 int main()
    19 {
    20     int n,m,number;
    21     node x;
    22     scanf("%d",&n);
    23     while(n--)
    24     {
    25         scanf("%d",&m);
    26         int i;
    27         for(i=0;i<m;i++)
    28         {
    29             scanf("%d%d",&x.p,&x.d);
    30             q.push(x);
    31         }
    32         i=1;
    33         while(!q.empty())
    34         {
    35             if(i%2)
    36             {
    37                 x=q.top();
    38                 q.pop();
    39                 x.p+=x.d;
    40                 q.push(x);
    41             }
    42             else
    43             {
    44                 number=q.top().p;
    45                 q.pop();
    46             }
    47             i++;
    48         }
    49         cout<<number<<endl;
    50     }
    51     return 0;
    52 }
    View Code
  • 相关阅读:
    常用基础命令
    Vim
    Linux目录结构
    稀疏数组
    数据结构概述
    天天用的命令
    Mysql和redis的安装
    回文排列
    URL化
    在word中做复选框打对勾钩
  • 原文地址:https://www.cnblogs.com/teilawll/p/3567767.html
Copyright © 2020-2023  润新知