HDU 4393 Throw nails
http://acm.hdu.edu.cn/showproblem.php?pid=4393
题意:有n个人,i-th人第一秒速度为Fi/s,之后Si/s。每一秒末,跑在最前面的人消失,如果有多个人同时在最前面,id最小的人消失。输出消失顺序。
题解:因为Si最多只有100个,所以对Si进行操作。采用优先队列,相同Si的压进相同的队列。求每一次最大的Fi+Si*t。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <queue> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int maxn=50010; 10 11 struct node{ 12 int F,S,id; 13 bool operator<(const node &x) const { 14 if(F!=x.F) return F<x.F; 15 return id>x.id; 16 } 17 }P[maxn]; 18 19 priority_queue<node> pque[110]; 20 21 int main() 22 { 23 //freopen("/Users/apple/Desktop/codeblocks/D.txt","r",stdin); 24 25 int T,n; 26 scanf("%d",&T); 27 for(int ca=1;ca<=T;ca++) 28 { 29 scanf("%d",&n); 30 for(int i=0;i<n;i++) 31 { 32 scanf("%d%d",&P[i].F,&P[i].S); 33 P[i].id=i+1; 34 pque[P[i].S].push(P[i]); 35 } 36 int t; 37 node tmp; 38 int mtime=0; 39 int ide; 40 int k; 41 printf("Case #%d:\n",ca); 42 int flag=1; 43 int flag1=n; 44 while(n--) 45 { 46 flag++; 47 t=-1; 48 for(int i=1;i<=100;i++) 49 { 50 51 if(!pque[i].empty()) 52 { 53 tmp=pque[i].top(); 54 if(tmp.F+tmp.S*mtime>t) 55 { 56 t=tmp.F+tmp.S*mtime; 57 ide=tmp.id; 58 k=i; 59 } 60 else if(tmp.F+tmp.S*mtime==t) 61 { 62 if(tmp.id<ide) 63 { 64 ide=tmp.id; 65 k=i; 66 } 67 } 68 } 69 } 70 if(!pque[k].empty()) pque[k].pop(); 71 if(flag==flag1+1) printf("%d\n",ide); 72 else printf("%d ",ide); 73 mtime++; 74 } 75 } 76 return 0; 77 }