hdu 4302 优先队列
进一步学习了优先队列的用法
题意:一只小动物在直线上走,起始位置为零,之后会出现食物,动物要去距离自己最短的食物那,若两边的食物距离相等,则选择之前走的方向的食物
0 x,代表x的位置出现了食物,1代表去吃一个食物
1 #include<stdio.h> 2 #include<queue> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 struct cmp 7 { 8 bool operator()(int x,int y) 9 { 10 return x>y; 11 } 12 }; 13 priority_queue<int,vector<int>,cmp>q; 14 priority_queue<int>q2; 15 int main() 16 { 17 //freopen("in.txt","r",stdin); 18 //freopen("out.txt","w",stdout); 19 int T; 20 int L,n; 21 int A,B; 22 int iCase=0; 23 scanf("%d",&T); 24 while(T--) 25 { 26 iCase++; 27 scanf("%d%d",&L,&n); 28 while(!q.empty())q.pop(); 29 while(!q2.empty())q2.pop(); 30 int x=0; 31 int ans=0; 32 int t=1; 33 while(n--) 34 { 35 scanf("%d",&A); 36 if(A==0) 37 { 38 scanf("%d",&B); 39 if(B>=x)q.push(B); //记录右边的点 40 else q2.push(B); //记录左边的点 41 } 42 else 43 { 44 if(!q.empty()&&!q2.empty()) 45 { 46 int temp1=q.top(); 47 int temp2=q2.top(); 48 if(temp1-x<x-temp2) 49 { 50 t=1; 51 ans+=q.top()-x; 52 x=q.top(); 53 q.pop(); 54 } 55 else if(temp1-x>x-temp2) 56 { 57 t=-1; 58 ans+=x-q2.top(); 59 x=q2.top(); 60 q2.pop(); 61 } 62 else if(t==1) 63 { 64 ans+=q.top()-x; 65 x=q.top(); 66 q.pop(); 67 } 68 else 69 { 70 ans+=x-q2.top(); 71 x=q2.top(); 72 q2.pop(); 73 } 74 } 75 else if(!q.empty()) 76 { 77 t=1; 78 ans+=q.top()-x; 79 x=q.top(); 80 q.pop(); 81 } 82 else if(!q2.empty()) 83 { 84 t=-1; 85 ans+=x-q2.top(); 86 x=q2.top(); 87 q2.pop(); 88 } 89 } 90 91 } 92 printf("Case %d: %d ",iCase,ans); 93 } 94 return 0; 95 }