ZOJ 3888 Twelves Monkeys (预处理+优先队列)
Posted jhcelue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ 3888 Twelves Monkeys (预处理+优先队列)相关的知识,希望对你有一定的参考价值。
题意:题目描写叙述起来比較绕,直接讲案例
9 3 3
9 1
6 1
4 1
6
7
2
输入n,m,q。n限制了你询问的年份,m台时光机,q个询问。
接下来m行,描写叙述从第9年回到第1年。
接下里就是三个询问。
第一个询问6的答案是5.
1.从第6年回到第1年 (6-1)直接做时光机2,(6-7-8-9-1)过3年之后能够做时光机3。
有两个路径能够走(题目中要求至少两条路径)。所以是有效的方案。
2.从第6年回到第2年
.....
思路:先按第一维排序,查找大于等于X(X是询问的年份)的有多少个,若个数小于2。该方案不可行,若个数大于等于2。在查找全部第一维大于等于X的区间中第二维的第二小的值,答案就是X-第二小的值
AC代码:
#include <stdio.h> #include <algorithm> #include <queue> #include <string.h> using namespace std; struct node { int a,b; }; struct node p[50010]; bool cmp(node a,node b) { if(a.a!=b.a) return a.a>b.a; return a.b>b.b; } int sum[50010]; priority_queue<int, vector<int>, greater<int> > que; int main() { int i,j; int n,m,q,c; while(scanf("%d %d %d",&n,&m,&q)!=EOF) { while(!que.empty()) que.pop(); for(i=0; i<m; i++) { scanf("%d %d",&p[i].a,&p[i].b); } sort(p,p+m,cmp); sum[1]=0; int a1,a2; for(i=n,j=0; i>=2; i--) { for(; j<m; j++) { if(i<=p[j].a) que.push(p[j].b); else break; } if((int)que.size()<2) { sum[i]=0; continue; } a1=que.top(); que.pop(); a2=que.top(); que.pop(); que.push(a1); que.push(a2); if(i-a2<0) sum[i]=0; else sum[i]=i-a2; } while(q--) { scanf("%d",&c); printf("%d\n",sum[c]); } } return 0; }
以上是关于ZOJ 3888 Twelves Monkeys (预处理+优先队列)的主要内容,如果未能解决你的问题,请参考以下文章