标签:
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 76 Accepted Submission(s): 42
Special Judge
4
8
4 1 3 2 2 1 0 3
5 3 6 4 2 1 7 6
8
3 3 2 0 5 0 3 6
4 5 2 7 7 6 7 6
8
2 2 3 3 3 0 0 2
7 4 3 6 3 2 2 5
8
5 6 5 3 3 1 2 4
6 7 7 6 5 4 3 5
/** 题意:现在有n个人,然后soda想要n个人尽可能多的去野营,每个人去野营是要在soda询问他时, 他所知道的去的人数大于等于L[i] 小于等于R[i] 然后问哪种询问顺序,可以使去的人数最多 做法:结构体 + 优先队列 首先第一个人的L[i]必须是0,然后在同样的下标为L[i]的进队列, 然后队列中的元素按照r[i]的大小排序,使得R[i]最小的优先 **/ #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <cmath> #include <queue> using namespace std; #define maxn 100000 + 10 int vis[maxn]; int mmap[maxn]; struct Node { int l; int r; int id; bool operator <(const Node &a)const { return r > a.r; } Node() { l = 0; r = 0; id = 0; } } node[maxn]; int cmp(Node a,Node b) { if(a.l != b.l) return a.l < b.l; return a.r , b.r; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&node[i].l); } for(int i=0; i<n; i++) { scanf("%d",&node[i].r); node[i].id = i+1; } sort(node,node+n,cmp); memset(mmap,0,sizeof(mmap)); priority_queue<Node>que; while(!que.empty()) que.pop(); int sum = 0; int tt = 0; int tt1 = n-1; if(node[0].l != 0) { printf("0\n"); for(int i=0; i<n; i++) { printf("%d",i+1); if(i!= n-1) printf(" "); else printf("\n"); } continue; } que.push(node[0]); Node now,tmp; int i = 1; while(!que.empty()) { for(; node[i].l == sum&&i<n; i++) que.push(node[i]); while(!que.empty()) { if(que.top().r >= sum) { int tx = que.top().id; mmap[tt++] = tx; sum++; que.pop(); break; } else mmap[tt1--] = que.top().id; que.pop(); } for(;node[i].l == sum&&i<n;i++) que.push(node[i]); } for(;i<n;i++) mmap[tt1--] = node[i].id; printf("%d\n",tt); for(i=0;i<n;i++) { printf("%d",mmap[i]); if(i!= n-1) printf(" "); else printf("\n"); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4708819.html