hdu 4393(优先队列)

来源:互联网 发布:视频放慢软件手机软件 编辑:程序博客网 时间:2024/06/02 03:55

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4393

思路:考虑Si最大只有100,所以我们可以建立优先队列数组s[1..100],对于每个优先队列,按第一关键字Fi第二关键字ID排序,每次取出所有的优先队列里最大值,然后直接 计算(Time-1)*Si + Fi 找最大的way,将对应的优先队列pop并输出对应ID即可。

View Code
 1 #include<iostream> 2 #include<queue> 3 const int N=110; 4 using namespace std; 5  6 struct Point{ 7     int dis,id; 8     bool operator < (const Point &p) const { 9         if(dis!=p.dis)10             return dis<p.dis;11         return id>p.id;12     }    13 };14 priority_queue<Point>Q[N];15 16 int main(){17     int _case,t=1;18     scanf("%d",&_case);19     while(_case--){20         int n,f,s;21         scanf("%d",&n);22         for(int i=1;i<=n;i++){23             Point p;24             scanf("%d%d",&f,&s);25             p.dis=f;26             p.id=i;27             Q[s].push(p);28         }29         printf("Case #%d:\n",t++);30         for(int i=1;i<=n;i++){31             int max=-1,id=100000,ans;32             for(int j=1;j<=N;j++){33                 if(!Q[j].empty()){34                     Point p=Q[j].top();35                     if((i-1)*j+p.dis>max||(i-1)*j+p.dis==max&&p.id<id){36                         max=(i-1)*j+p.dis;37                         id=p.id;38                         ans=j;39                     }40                 }41             }42             int tmp=Q[ans].top().id;43             if(i==n){44                 printf("%d\n",tmp);45             }else 46                 printf("%d ",tmp);47             Q[ans].pop();48         }49     }50     return 0;51 }

 

0 0
原创粉丝点击