1026 Table Tennis (30 分)PTA甲級 測試點(diǎn)分析

題目鏈接

A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For any pair of players, if there are some tables open when they arrive, they will be assigned to the available table with the smallest number. If all the tables are occupied, they will have to wait in a queue. It is assumed that every pair of players can play for at most 2 hours.
Your job is to count for everyone in queue their waiting time, and for each table the number of players it has served for the day.
One thing that makes this procedure a bit complicated is that the club reserves some tables for their VIP members. When a VIP table is open, the first VIP pair in the queue will have the priviledge to take it. However, if there is no VIP in the queue, the next pair of players can take it. On the other hand, if when it is the turn of a VIP pair, yet no VIP table is available, they can be assigned as any ordinary players.

Input Specification:

Each input file contains one test case. For each case, the first line contains an integer N (<=10000) - the total number of pairs of players. Then N lines follow, each contains 2 times and a VIP tag: HH:MM:SS - the arriving time, P - the playing time in minutes of a pair of players, and tag - which is 1 if they hold a VIP card, or 0 if not. It is guaranteed that the arriving time is between 08:00:00 and 21:00:00 while the club is open. It is assumed that no two customers arrives at the same time. Following the players' info, there are 2 positive integers: K (<=100) - the number of tables, and M (< K) - the number of VIP tables. The last line contains M table numbers.

Output Specification:

For each test case, first print the arriving time, serving time and the waiting time for each pair of players in the format shown by the sample. Then print in a line the number of players served by each table. Notice that the output must be listed in chronological order of the serving time. The waiting time must be rounded up to an integer minute(s). If one cannot get a table before the closing time, their information must NOT be printed.

Sample Input:
9
20:52:00 10 0
08:00:00 20 0
08:02:00 30 0
20:51:00 10 0
08:10:00 5 0
08:12:00 10 1
20:50:00 10 0
08:01:30 15 1
20:53:00 10 1
3 1
2
Sample Output:
08:00:00 08:00:00 0
08:01:30 08:01:30 0
08:02:00 08:02:00 0
08:12:00 08:16:30 5
08:10:00 08:20:00 10
20:50:00 20:50:00 0
20:51:00 20:51:00 0
20:52:00 20:52:00 0
3 3 2

題目大意

k張桌子奠宜,球員到達(dá)后總是選擇編號最小的桌子。如果訓(xùn)練時間超過2h會被壓縮成2h,如果到達(dá)時候沒有球桌空閑就變成隊(duì)列等待。k張桌子中m張是vip桌扩劝,如果vip桌子有空閑蛙婴,而且隊(duì)列里面有vip成員,那么等待隊(duì)列中的第一個vip球員會到最小的vip球桌訓(xùn)練唧取。如果vip桌子空閑但是沒有vip來展辞,那么就分配給普通的人奥邮。如果沒有vip球桌空閑,那么vip球員就當(dāng)作普通人處理罗珍。
給出每個球員的到達(dá)時間洽腺、要玩多久、是不是vip(是為1不是為0)覆旱。給出球桌數(shù)和所有vip球桌的編號蘸朋,QQ所有在關(guān)門前得到訓(xùn)練的球員的到達(dá)時間、訓(xùn)練開始時間通殃、等待時長(取整數(shù)度液,四舍五入)厕宗,營業(yè)時間為8點(diǎn)到21點(diǎn)画舌。如果再21點(diǎn)后還沒有開始玩的人,就不再玩已慢,不需要輸出~
————————————————
摘自CSDN博主「柳婼」的原創(chuàng)文章
原文鏈接:https://blog.csdn.net/liuchuo/article/details/54576965

測試點(diǎn)分析

一開始錯了四個點(diǎn):測試點(diǎn)3曲聂、測試點(diǎn)5、測試點(diǎn)7佑惠、測試點(diǎn)8

測試點(diǎn)3:只有一個人來并關(guān)門了
//  測試點(diǎn)3樣例
1
21:00:00 10 1
3 0
測試點(diǎn)5朋腋、7:都是vip用戶要選擇第一張空閑的vip桌,注意時間可以取等膜楷,即剛好打完到了
測試點(diǎn)8:最后計(jì)算等待時間的時候>=30向上進(jìn)1旭咽,用(start-arrive+30)/60就行了

AC代碼

#include<bits/stdc++.h>
using namespace std;

struct cus{
    int arri, play, vip;
    int start;
};

bool cmp1(cus a, cus b){
    return a.arri < b.arri;
}

bool cmp2(cus a, cus b){
    return a.start<b.start;
}

void prt(int x){
    int h, m, s;
    h = x/3600;
    m = x/60 -h*60;
    s = x%60;
    printf("%02d:%02d:%02d ", h, m, s);
}

int main(){
    int n, m, k;
    scanf("%d", &n);
    vector<cus> data(n);
    for(int i=0; i<n; i++){
        int h, m, s;
        scanf("%d:%d:%d %d %d", &h, &m, &s, &data[i].play, &data[i].vip);
        data[i].play = min(120, data[i].play)*60; //測試點(diǎn)4
        data[i].arri = h*3600 + m*60 +s;
    }
    scanf("%d %d", &m, &k);
    vector<int> times(m, 8*3600);
    vector<int> cnt(m);
    vector<bool> is_vip(m, false);
    for(int i=0; i<k; i++){
        int t;
        scanf("%d", &t);
        is_vip[t-1] = true;
    }
    sort(data.begin(), data.end(), cmp1);
    for(int i=0; i<n; i++){
        if(data[i].start) continue;
        int mint=21*3600, table=-1, player=i;
        for(int j=0; j<m; j++){
            if(times[j]<mint){
                table = j;
                mint = times[j];
            }
        }
        if(table==-1) data[i].start = mint;
        else{
            if(is_vip[table]&&!data[i].vip){
                for(int j=i; j<n&&data[j].arri<=mint&&player==i; j++) if(data[j].vip&&!data[j].start) player=j;
                if(player!=i) i--;
            }
            else if(data[i].vip&&!is_vip[table]){
                for(int j=0; j<m; j++){ //測試點(diǎn)5在vip用戶用第一張空閑的vip桌
                    if(times[j]<=data[i].arri&&is_vip[j]){ //測試點(diǎn)7在這個等于號
                        table = j; break;
                    }
                }
            }
            data[player].start = max(mint, data[player].arri);
            times[table] = data[player].start + data[player].play;
            if(data[player].start<21*3600) cnt[table]++; //測試點(diǎn)3在這個判斷,第一個用戶就超過21點(diǎn)不能計(jì)數(shù)
        }
    }
    sort(data.begin(), data.end(), cmp2);
    for(int i=0; i<n; i++){
        if(data[i].start>=21*3600) continue;
        prt(data[i].arri);
        prt(data[i].start);
        printf("%d\n", (data[i].start-data[i].arri+30)/60);     //測試點(diǎn)8在這個分鐘的四舍五入
    }
    for(int i=0; i<m; i++) printf("%d%s", cnt[i], i==m-1?"\n":" ");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赌厅,一起剝皮案震驚了整個濱河市穷绵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌特愿,老刑警劉巖仲墨,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勾缭,死亡現(xiàn)場離奇詭異,居然都是意外死亡目养,警方通過查閱死者的電腦和手機(jī)俩由,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幻梯,“玉大人,你說我怎么就攤上這事努释±衤茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵洽洁,是天一觀的道長痘系。 經(jīng)常有香客問我,道長饿自,這世上最難降的妖魔是什么汰翠? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮昭雌,結(jié)果婚禮上复唤,老公的妹妹穿的比我還像新娘。我一直安慰自己烛卧,他們只是感情好佛纫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著总放,像睡著了一般呈宇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上局雄,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天甥啄,我揣著相機(jī)與錄音,去河邊找鬼炬搭。 笑死蜈漓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宫盔。 我是一名探鬼主播融虽,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灼芭!你這毒婦竟也來了有额?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谆吴,沒想到半個月后倒源,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡句狼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年笋熬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腻菇。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡胳螟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筹吐,到底是詐尸還是另有隱情糖耸,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布丘薛,位于F島的核電站嘉竟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洋侨。R本人自食惡果不足惜舍扰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望希坚。 院中可真熱鬧边苹,春花似錦、人聲如沸裁僧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聊疲。三九已至茬底,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間售睹,已是汗流浹背桩警。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昌妹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓握截,卻偏偏與公主長得像飞崖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谨胞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容