PAT 1026 Table tennis
来源:互联网 发布:网络推广代理公司 编辑:程序博客网 时间:2024/04/30 22:44
题目网址: https://www.patest.cn/contests/pat-a-practise/1026
看这个代码要比下面格式舒服一些: https://www.patest.cn/submissions/2199496/source
#include <iostream>#include <queue>#include <list>#include <algorithm>#include <stdio.h>using namespace std;#define MAX_N 10005#define MAX_TABLE 105struct Player{ string arrive_time; int n_arrive_time; int play_time; int vip; string serve_time; int n_serve_time; int wait_time;}g_player[MAX_N];struct Table{ int id; // 1 - N int vip; string end_time; int n_end_time; int count;}g_table[MAX_TABLE];int toInt(string const &time){ int i; const char *tmp; int res = 0; for(i = 0; i < 3; ++i) { tmp = time.substr(i*3, 2).c_str(); res = res * 60 + ((tmp[0]-'0') * 10 + (tmp[1]-'0')); } return(res);}void toChar(char s[], int ss){ s[0] = ss / 10 + '0'; s[1] = ss % 10 + '0'; s[2] ='\0';}string toString(int time){ int ss = time % 60; int mm = (time / 60) % 60; int hh = time / (60 * 60); char s[3], m[3], h[3]; toChar(s, ss); toChar(m, mm); toChar(h, hh); string str = string(h) + ":" + string(m) + ":" + string(s); return(str);}bool player_comp(Player *a, Player *b){ return(a->n_arrive_time < b->n_arrive_time);}struct table_comp{ bool operator()(Table *a, Table *b) { return(a->id > b->id); }};struct busy_table_comp{ bool operator()(Table *a, Table *b) { return(a->n_end_time > b->n_end_time); }};typedef priority_queue<Table *, vector<Table*>, table_comp> table_type;typedef priority_queue<Table *, vector<Table*>, busy_table_comp> busy_table_type;void assignTable(Player *player, Table *table, int cur_time){ player->serve_time = toString(cur_time); player->n_serve_time = cur_time; player->wait_time = (cur_time - toInt(player->arrive_time) + 30) / 60; table->n_end_time = cur_time + player->play_time * 60; table->end_time = toString(table->n_end_time); ++table->count;}void processUtil(Player *player_arr[], int nplayer, table_type &free_table,table_type &free_vip_table, vector<Player*> &result){ queue<Player *> wait_queue_vip; queue<Player *> wait_queue; int i, j; Table *table; Player *player; busy_table_type busy_table; int cur_time = 8 * 60 * 60; int end = 21 * 60 * 60; i = 0; for(; cur_time < end; ++cur_time) { // if someone is comming at this moment ... if(i < nplayer && cur_time == player_arr[i]->n_arrive_time) { if(player_arr[i]->vip == 1) wait_queue_vip.push(player_arr[i]); else wait_queue.push(player_arr[i]); ++i; } // update busy table for(;!busy_table.empty() && (table = busy_table.top())->n_end_time == cur_time;) { busy_table.pop(); if(table->vip == 1) free_vip_table.push(table); else free_table.push(table); } // update wait queue // for vip for(; !wait_queue_vip.empty() && !free_vip_table.empty();) { player = wait_queue_vip.front(); wait_queue_vip.pop(); table = free_vip_table.top(); free_vip_table.pop(); assignTable(player, table, cur_time); result.push_back(player); busy_table.push(table); } // for non-vip for(; ;) { // Choose a player player = NULL; if(!wait_queue.empty()) player = wait_queue.front(); if(!wait_queue_vip.empty()) { if(player == NULL) player = wait_queue_vip.front(); else if(player->n_arrive_time > wait_queue_vip.front()->n_arrive_time) player = wait_queue_vip.front(); } if(player == NULL) // no player break; // choose a table table = NULL; if(!free_table.empty()) table = free_table.top(); if(!free_vip_table.empty()) { if(table == NULL) table = free_vip_table.top(); else if(table->id > free_vip_table.top()->id) table = free_vip_table.top(); } if(table == NULL) // no table break; if(player->vip == 1) wait_queue_vip.pop(); else wait_queue.pop(); if(table->vip == 1) free_vip_table.pop(); else free_table.pop(); assignTable(player, table, cur_time); result.push_back(player); busy_table.push(table); } }// for(cur_time)}void printResult(vector<Player*> const &result, Table table[], int ntable){ int i; for(i = 0; i < result.size(); ++i) { Player *cur_player = result[i]; cout << cur_player->arrive_time << " " ; // cout << toInt(cur_player->arrive_time) << " "; // cout << cur_player->play_time << " "; // cout << cur_player->vip << " "; cout << cur_player->serve_time << " "; cout << cur_player->wait_time << "\n"; } for(i = 0; i < ntable; ++i) { cout << table[i].count; cout << ((i == ntable - 1) ? "\n" : " "); }}void process(Table table[], Player player[], int ntable, int nplayer){ int i; Player **player_arr; table_type free_vip_table; table_type free_table; vector<Player*> result; player_arr = new Player*[nplayer]; for(i = 0; i < nplayer; ++i) player_arr[i] = &player[i]; // sort players according to the arrive time sort(player_arr, player_arr + nplayer, player_comp); // construct free vip table and free table for(i = 0; i < ntable; ++i) { if(table[i].vip == 1) free_vip_table.push(&table[i]); else free_table.push(&table[i]); } processUtil(player_arr, nplayer, free_table, free_vip_table, result); printResult(result, table, ntable); delete []player_arr;}int main(){#ifdef LINUX freopen("pat1026.in", "r", stdin);#endif int i; int N; // the total number of pairs of players int K; // the number of tables int M; // the number of VIP tables cin >> N; for(i = 0; i < N; ++i) { cin >> g_player[i].arrive_time; g_player[i].n_arrive_time = toInt(g_player[i].arrive_time); cin >> g_player[i].play_time; if(g_player[i].play_time > 120) g_player[i].play_time = 120; cin >> g_player[i].vip; } cin >> K >> M; for(i = 0; i < K; ++i) { g_table[i].id = i + 1; g_table[i].vip = 0; g_table[i].end_time = "08:00:00"; g_table[i].n_end_time = toInt(g_table[i].end_time); g_table[i].count = 0; } for(i = 0; i < M; ++i) { int num; cin >> num; g_table[num-1].vip = 1; } process(g_table, g_player, K, N); return(0);}
0 0
- PAT 1026 Table tennis
- PAT 1026 table tennis BONUS1
- PAT 1026 Table Tennis (30)
- Pat(Advanced Level)Practice--1026(Table Tennis)
- Pat(Advanced Level)Practice--1026(Table Tennis)
- PAT 甲级 1026 Table Tennis(模拟)
- PAT 1026. Table Tennis
- 【PAT】1026. Table Tennis
- PAT 1026. Table Tennis (30)
- 1026. Table Tennis (30)-PAT
- PAT 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)
- pat 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)
- PAT (Advanced Level) Practise 1026 Table Tennis (30)
- PAT (Advanced Level) Practise 1026 Table Tennis (30)
- PAT 1026. Table Tennis (30) 【26/30】
- PAT A 1026. Table Tennis (30)
- 生活中的化学物质
- 如何解决IE会自动下载返回的JSON数据
- ios应用内跳转到appstore里评分
- 【Spark Java API】Action(5)—treeAggregate、treeReduce
- python中os.path以及sys.path模块简介
- PAT 1026 Table tennis
- gulp 配置
- React Native入门基础——Props
- HUST 1010 KMP最短循环节
- 过早的优化是万恶之源,细数优化7大原则
- html中表单post方法与php还有sql交互的最简单demo
- 字符串的拼接
- 创建第一个node,express,ejs网站详细介绍
- 2016/08/20 接口