Stones

題目是:HDU1896php

題目簡述:輸入一堆石頭,每一個石頭有本身所在的位置p,以及本身能夠拋多遠的距離d。你每遇到第奇數個石頭,就把石頭丟出去,第偶數個石頭就無論。計算出最後一個石頭它所處的位置。html

解法:該題我採起的是先用優先隊列對石頭進行排序,而後再對每一個石頭進行處理,奇數石頭就計算出石頭的新位置在插進隊列去,偶數石頭就刪除,最後所剩的石頭的位置就是所求的位置。node

Σ( ̄。 ̄ノ)ノ好久沒敲代碼。。。。優先隊列都快忘記怎麼寫了。。。。複習一下:優先隊列ios

頭文件:ide

#include <queue>函數

基本操做:spa

empty()       若是隊列爲空返回真3d

pop()           刪除對頂元素code

size()           返回優先隊列中擁有的元素個數htm

top()            返回優先隊列對頂元素

在默認的優先隊列中,優先級高的先出隊。在默認的int型中先出隊的爲較大的數。

聲明方式:

一、普通方法:

priority_queue<int>q;
//經過操做,按照元素從大到小的順序出隊

二、自定義優先級:

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;//定義方法
//其中,第二個參數爲容器類型。第三個參數爲比較函數。
 

三、結構體聲明方式:

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
相關文章
相關標籤/搜索