problemscpp
A collection of my answers to algorithm problems in c++.
| 函数 | 变量
pat::a::a1026 命名空间参考

  1. 乒乓球
更多...

struct  player
 
struct  table
 

函数

void assign (priority_queue< player, vector< player >, greater< player > > &players, priority_queue< table, vector< table >, greater< table > > &tables, vector< player > &vec, vector< unsigned > &table_cnt)
 
int main (istream &cin, ostream &cout)
 
 TEST (a1026, case1)
 
string timefmt (unsigned t)
 

变量

const unsigned INF = 1000000
 

详细描述

  1. 乒乓球

函数说明

◆ assign()

void pat::a::a1026::assign ( priority_queue< player, vector< player >, greater< player > > &  players,
priority_queue< table, vector< table >, greater< table > > &  tables,
vector< player > &  vec,
vector< unsigned > &  table_cnt 
)

在文件 pat.cpp4580 行定义.

4580 {
4581 auto p = players.top();
4582 players.pop();
4583 const auto t = tables.top();
4584 tables.pop();
4585 p.waiting_time = round((t.end_time - p.arrival_time) / 60.0);
4586 p.start_time = t.end_time;
4587 table_cnt[t.id]++;
4588 vec.push_back(p);
4589 tables.push({t.id, t.end_time + p.p});
4590 }
int vec[100010]
Definition: pat.cpp:5095

引用了 pat::a::a7_2::vec.

被这些函数引用 main().

◆ main()

int pat::a::a1026::main ( istream &  cin,
ostream &  cout 
)

在文件 pat.cpp4592 行定义.

4592 {
4593 unsigned n;
4594 cin >> n;
4595 priority_queue<player, vector<player>, greater<player>> normal_players;
4596 priority_queue<player, vector<player>, greater<player>> vip_players;
4597 player nop;
4598 nop.arrival_time = INF;
4599 normal_players.push(nop);
4600 vip_players.push(nop);
4601 for(unsigned i = 0; i < n; i++) {
4602 string arrival_time_str;
4603 unsigned p;
4604 unsigned tag;
4605 cin >> arrival_time_str >> p >> tag;
4606 auto ply = player(arrival_time_str, p, tag);
4607 if(ply.vip) {
4608 vip_players.push(ply);
4609 } else {
4610 normal_players.push(ply);
4611 }
4612 }
4613 unsigned k;
4614 unsigned m;
4615 cin >> k >> m;
4616 vector<unsigned> table_cnt(k + 1, 0);
4617 priority_queue<table, vector<table>, greater<table>> normal_tables;
4618 priority_queue<table, vector<table>, greater<table>> vip_tables;
4619 normal_tables.push({0, INF});
4620 vip_tables.push({0, INF});
4621 unordered_set<unsigned> vipid;
4622 for(unsigned i = 0; i < m; i++) {
4623 unsigned id;
4624 cin >> id;
4625 vipid.insert(id);
4626 }
4627 for(unsigned i = 1; i <= k; i++) {
4628 if(static_cast<unsigned int>(vipid.contains(i)) != 0U) {
4629 vip_tables.push({i, 8 * 60 * 60});
4630 } else {
4631 normal_tables.push({i, 8 * 60 * 60});
4632 }
4633 }
4634 vector<player> players;
4635 while(normal_players.size() > 1 || vip_players.size() > 1) {
4636 auto np = normal_players.top();
4637 auto vp = vip_players.top();
4638 unsigned arrive_time = min(np.arrival_time, vp.arrival_time);
4639 while(normal_tables.top().end_time < arrive_time) {
4640 auto t = normal_tables.top();
4641 normal_tables.pop();
4642 t.end_time = arrive_time;
4643 normal_tables.push(t);
4644 }
4645 while(vip_tables.top().end_time < arrive_time) {
4646 auto t = vip_tables.top();
4647 vip_tables.pop();
4648 t.end_time = arrive_time;
4649 vip_tables.push(t);
4650 }
4651 auto nt = normal_tables.top();
4652 auto vt = vip_tables.top();
4653 unsigned end_time = min(nt.end_time, vt.end_time);
4654
4655 if(end_time >= 21 * 60 * 60) {
4656 break;
4657 }
4658
4659 if(vp.arrival_time <= end_time && vt.end_time == end_time) {
4660 assign(vip_players, vip_tables, players, table_cnt);
4661 } else if(np.arrival_time < vp.arrival_time) {
4662 if(nt > vt) {
4663 assign(normal_players, vip_tables, players, table_cnt);
4664 } else {
4665 assign(normal_players, normal_tables, players, table_cnt);
4666 }
4667 } else {
4668 if(nt > vt) {
4669 assign(vip_players, vip_tables, players, table_cnt);
4670 } else {
4671 assign(vip_players, normal_tables, players, table_cnt);
4672 }
4673 }
4674 }
4675 sort(players.begin(), players.end());
4676 for(auto &player: players) {
4677 cout << timefmt(player.arrival_time) << ' ' << timefmt(player.start_time) << ' ' << player.waiting_time << endl;
4678 }
4679 cout << table_cnt[1];
4680 for(unsigned i = 2; i <= k; i++) {
4681 cout << ' ' << table_cnt[i];
4682 }
4683 return 0;
4684 }
void assign(priority_queue< player, vector< player >, greater< player > > &players, priority_queue< table, vector< table >, greater< table > > &tables, vector< player > &vec, vector< unsigned > &table_cnt)
Definition: pat.cpp:4580
string timefmt(unsigned t)
Definition: pat.cpp:4567
unsigned arrival_time
Definition: pat.h:866

引用了 pat::a::a1026::player::arrival_time, assign(), INF, pat::a::a1026::player::start_time, timefmt() , 以及 pat::a::a1026::player::waiting_time.

被这些函数引用 TEST().

◆ TEST()

pat::a::a1026::TEST ( a1026  ,
case1   
)

在文件 pat_test.cpp2115 行定义.

2115 {
2116 istringstream in("9\n20:52:00 10 0\n08:00:00 20 0\n08:02:00 30 0\n20:51:00 10 0\n08:10:00 5 0\n08:12:00 10 1\n20:50:00 10 0\n08:01:30 15 1\n20:53:00 10 1\n3 1\n2");
2117 auto out = ostringstream();
2118 main(in, out);
2119 ASSERT_EQ("08:00:00 08:00:00 0\n08:01:30 08:01:30 0\n08:02:00 08:02:00 0\n08:12:00 08:16:30 5\n08:10:00 08:20:00 10\n20:50:00 20:50:00 0\n20:51:00 20:51:00 0\n20:52:00 20:52:00 0\n3 3 2", out.str());
2120 }
int main(int argc, char **argv)
Definition: main.cpp:5

引用了 main().

◆ timefmt()

string pat::a::a1026::timefmt ( unsigned  t)

在文件 pat.cpp4567 行定义.

4567 {
4568 ostringstream oss;
4569 const unsigned s = t % 60;
4570 t /= 60;
4571 const unsigned m = t % 60;
4572 t /= 60;
4573 const unsigned h = t;
4574 oss << setw(2) << setfill('0') << right << h << ':'
4575 << setw(2) << setfill('0') << right << m << ':'
4576 << setw(2) << setfill('0') << right << s;
4577 return oss.str();
4578 }

引用了 acwing::acwing1929::right.

被这些函数引用 main().

变量说明

◆ INF

const unsigned pat::a::a1026::INF = 1000000

在文件 pat.h862 行定义.

被这些函数引用 main().