標籤:
Problem Description一批幸福的列車即將從杭州駛向幸福的終點站——溫州,身為總列車長的linle有一些奇怪的癖好。
他會記錄下全部乘客的名字(name)和他們的人品值(RP),根據這些將他們排序,並不時地從某輛列車裡踢出人品最不好(RP值最低)的一個人,當兩個人人品一樣不好時,他就會踢出名字難聽的人(linle認為按字典順序,排在越在後面的人名字越難聽)。
當然出於列車行駛需要,他還會不時的發布一些命令,比如讓某個乘客上車,合并某兩輛列車等。
linle的上一任秘書***因為不能高效地執行他的這些命令而被炒魷魚,他現在正在尋覓新的秘書人選,你能不能勝任呢?(謝絕男士,待遇豐厚~~~)
Input本題包含多組測試,請處理到檔案結束。
對於每一組測試,第一行包含兩個整數 N ,M ,表示一共有N( N<=10000 ) 輛列車,執行M( M<=10000 )次操作。
接下來有 N (從1開始記數)輛列車的資訊,每輛列車先有一個數字 Xi(1 <= Xi <= 100 ),表示該列車有Xi個乘客,接下來Xi行乘客資訊,每個乘客包含名字(20個字元以內,不包含空白符)和人品(0<= RP <=30000)。
再接下來有 M 行操作資訊,一共有3種操作,分別為
GETON Xi name RP 表示有一個叫name的人品為RP的人登上第Xi列車
JOIN Xi Xj 表示有將第Xj輛列車合并到Xi輛列車
GETOUT Xi 表示從第Xi輛列車踢出一個人品最差的人
測試資料保證每個操作均合法,即不會將已經被合并到其他列車的列車再進行合并,也不會從一輛空列車裡踢出乘客
Output對於每個 GETOUT 命令,輸出被踢出的那個人的名字
Sample Input
3 52xhd 0zl 128600 1ll 21Ignatius 3GETOUT 1JOIN 1 2GETOUT 1GETON 3 hoho 2GETOUT 3
Sample Output
xhdzlhohoHintHuge input, scanf is recommended.
#include<cstdio>#include<cstring>#include<queue>#define max 10000+100using namespace std;struct train{char name[22];int rp;friend bool operator < (train a,train b){if(a.rp==b.rp){return strcmp(a.name,b.name)<0;}return a.rp>b.rp;//從小到大排列 隊伍 }};train temp;int main(){int n,m,p;//n輛車,m條命令int i,j;int num,num1,num2;char str[10];while(~scanf("%d%d",&n,&m)){priority_queue<train>q[max];for(i=1;i<=n;++i){scanf("%d",&p);while(p--){scanf("%s %d",temp.name,&temp.rp);q[i].push(temp);}}while(m--){scanf("%s",str);if(strcmp(str,"GETOUT")==0){scanf("%d",&num);temp=q[num].top();if(!q[num].empty())//出隊列之前一定要判斷非空 {printf("%s\n",temp.name);q[num].pop();}}else if(strcmp(str,"GETON")==0){scanf("%d",&num);scanf("%s %d",temp.name,&temp.rp);q[num].push(temp);}else if(strcmp(str,"JOIN")==0){scanf("%d%d",&num1,&num2);while(!q[num2].empty()){temp=q[num2].top();q[num2].pop();q[num1].push(temp);}}}}return 0;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
hdu杭電1434 幸福列車【優先隊列】