HDU 5360 (优先队列)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360
用优先队列进行处理,对于struct来讲,需要重载一下小于号。。。(又学到了新知识。)网上大神太多。
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 struct NODE 8 { 9 int x,y; 10 int num; 11 bool operator < (const NODE &a) const 12 { 13 return y>a.y;//最小值优先 14 } 15 }node[100005]; 16 bool cmp(const NODE&a, const NODE&b) 17 { 18 if(a.x==b.x) return a.y<b.y; 19 else return a.x<b.x; 20 } 21 22 23 int n; 24 int ans[100005]; 25 int vis[100005]; 26 int main() 27 { 28 int t; 29 scanf ("%d",&t); 30 while (t--) 31 { 32 memset(ans,0,sizeof(ans)); 33 memset(vis,0,sizeof(vis)); 34 scanf ("%d",&n); 35 for(int i=1;i<=n;i++) 36 { 37 scanf ("%d",&node[i].x); 38 node[i].num=i; 39 } 40 for(int i=1;i<=n;i++) 41 scanf ("%d",&node[i].y); 42 sort(node+1,node+n+1,cmp); 43 int num=0; 44 if(node[1].x>0) { 45 printf("%d\n",num);; 46 for(int i=1;i<=n;i++) 47 printf("%d ",i); 48 printf("\n"); 49 } 50 else 51 { 52 priority_queue<NODE> q; 53 q.push(node[1]); 54 int i=2,k1=1,k2=n; 55 while (!q.empty()) 56 { 57 for(;i<=n&&node[i].x==num;i++) 58 q.push(node[i]); 59 while (!q.empty()) 60 { 61 if(q.top().y>=num) 62 { 63 ans[k1++]=q.top().num; 64 num++; 65 q.pop(); 66 break; 67 } 68 else 69 ans[k2--]=q.top().num; 70 q.pop(); 71 } 72 for(;i<=n&&node[i].x==num;i++) 73 q.push(node[i]); 74 } 75 for(;i<=n;i++) 76 ans[k2--]=node[i].num; 77 printf("%d\n",num); 78 for(int i=1;i<=n;i++) 79 printf("%d%c",ans[i],i==n?'\n':' '); 80 } 81 } 82 return 0; 83 }
posted on 2015-08-10 12:45 Bei_insomia 阅读(101) 评论(0) 编辑 收藏 举报