勇士出征[HUST 1439]

勇士出征[HUST 1439]

时间1000ms,内存64MB

第十届“北大青鸟”杯浙江师范大学程序设计竞赛

这道题跟UVA-12100是一样的题目。我这里用的是STL的双端队列deque容器配合优先队列priority_queue,写起来会比较轻松;依次将输入压入队列,然后不断扫描队列,符合最大优先级的(优先队列的顶部元素)将其送出,而不再压入队尾。直到找到符合自己的标记的为止。

当然这道题也有用数组使用滚雪球的方式实现的,也就是开一个大的数组,每次将元素后挪时,直接将其放在数组末尾,而不用整体向前移动,这时候只需要将队首指针同时向后挪就可以了。总体来说这个题是用的队列思想,理解了队列就OK了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<deque>
 5 #include<queue>
 6 using namespace std;
 7 struct person
 8 {
 9     int level;
10     bool me;
11     person(int lv,int m):level(lv),me(m){}
12 };
13 int main()
14 {
15     int T;
16     scanf("%d",&T);
17     while(T--)
18     {
19         priority_queue<int> pq;
20         deque<person> dq;
21         int n,mypos,i;
22         scanf("%d%d",&n,&mypos);
23         for(i=0;i<n;i++)
24         {
25             int tmp;
26             scanf("%d",&tmp);
27             if(i+1==mypos)
28                 dq.push_back(person(tmp,true));
29             else
30                 dq.push_back(person(tmp,false));
31             pq.push(tmp);
32         }
33         int cnt=1;
34         while(!pq.empty())
35         {
36             if(dq.front().level!=pq.top())
37             {
38                 dq.push_back(dq.front());
39             }
40             else
41             {
42                 if(dq.front().me) break;
43                 else 
44                 {
45                     pq.pop();
46                     cnt++;
47                 }
48             }
49             dq.pop_front();
50         }
51         printf("%d\n",cnt);
52     }
53     return 0;
54 }

 

posted @ 2017-04-27 22:15  g63  阅读(194)  评论(0编辑  收藏  举报