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
原文地址:https://www.cnblogs.com/teilawll/p/3567767.html