HDU 1871 无题 优先队列

来源:互联网 发布:算法导论13章答案 编辑:程序博客网 时间:2024/04/28 22:42
点击打开链接


无题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2587    Accepted Submission(s): 1122


Problem Description
就要复试了,外地的考生都要在学校附近住宾馆了。假设在学校附近有C家宾馆,并且这些宾馆只有单人房,而每家宾馆的价格不一样,学生们都想找价格便宜的住,所以现在需要你的帮助,当有学生需要住宾馆的时候,告诉他哪个宾馆还有空的房间并且价格最便宜。而且有一个要求,同一个组的学生要住在同一个宾馆。
 

Input
输入包括多组数据。输入首先包括一个整数T(T <= 50),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表宾馆的个数,接下来是C行数据,每行3个整数,第一个代表宾馆的编号(<=1000),第二个是宾馆的房间数(<=50),第三个是宾馆的价格(<=1000)。
然后是一个整数T (T <= 1000),代表想找宾馆住的小组,接下来的T行每行代表一个要找宾馆的小组,每个小组不超过10人。
 

Output
对于每组数据中的想找宾馆的小组,输出他们应该找的宾馆编号。如果没有合适的宾馆或已经住满,输出”sorry”.
 

Sample Input
121 2 1002 3 12043 115
 

Sample Output
211sorry
 

Author
8600
 

Source
2008浙大研究生复试热身赛(2)——全真模拟
 

Recommend
lcy
 
将价格优先一下就可以了。

#include<stdio.h>#include<queue>using namespace std;struct node{    friend bool operator<(node n1,node n2)    {        return n2.price<n1.price;    }    int number;    int room;    int price;};node hotel[105];int team[1005];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int c;        scanf("%d",&c);        priority_queue<node>qu;        for(int i=0;i<c;i++)        {scanf("%d%d%d",&hotel[i].number,&hotel[i].room,&hotel[i].price);         qu.push(hotel[i]);        }        int m;        scanf("%d",&m);        for(int i=0;i<m;i++)        scanf("%d",&team[i]);        int j=0;        while(!qu.empty())        {            hotel[j].number=qu.top().number;            hotel[j].room=qu.top().room;            hotel[j].price=qu.top().price;            qu.pop();            j++;        }        int k=0,flag;        for(int i=0;i<m;i++)        {            flag=0;            for(int s=0;s<c;s++)            {                if(team[i]<=hotel[s].room)                {  hotel[s].room-=team[i];                   printf("%d\n",hotel[s].number);                   flag=1;                   break;                }            }            if(flag==0) printf("sorry\n");        }    }    return 0;}