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

1014 Waiting in Line 更多...

函数

int main (istream &cin, ostream &cout)
 
 TEST (a1014, case1)
 

详细描述

1014 Waiting in Line

函数说明

◆ main()

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

在文件 pat.cpp4307 行定义.

4307 {
4308 int n, m, k, q;
4309 cin >> n >> m >> k >> q;
4310 vector<int> t(k + 1);
4311 vector end_time(k + 1, -1);
4312 vector rest(n, -1);
4313 for(int i = 1; i <= k; i++) {
4314 cin >> t[i];
4315 }
4316 vector<queue<int>> qs(n);
4317 int next = 1;
4318 for(int i = 0; i < n && i < k; i++) {
4319 rest[i] = t[i + 1];
4320 }
4321 for(int i = 0; i < n * m && i < k; i++, next++) {
4322 qs[i % n].push(i + 1);
4323 }
4324 int current_time = 0;
4325 while(next <= k && current_time < 540) {
4326 int minimum = -1;
4327 for(int i = 0; i < n; i++) {
4328 if(rest[i] != -1) {
4329 if(minimum == -1) {
4330 minimum = rest[i];
4331 } else {
4332 minimum = min(minimum, rest[i]);
4333 }
4334 }
4335 }
4336 if(minimum != -1) {
4337 if(current_time + minimum >= 540) {
4338 break;
4339 }
4340 current_time += minimum;
4341 for(int i = 0; i < n; i++) {
4342 if(rest[i] != -1) {
4343 rest[i] -= minimum;
4344 }
4345 if(rest[i] == 0) {
4346 end_time[qs[i].front()] = current_time;
4347 qs[i].pop();
4348 rest[i] = qs[i].empty() ? -1 : t[qs[i].front()];
4349 }
4350 }
4351 }
4352 minimum = m;
4353 for(int i = 0; i < n; i++) {
4354 minimum = min(minimum, static_cast<int>(qs[i].size()));
4355 }
4356 for(int i = 0; i < n && next <= k; i++) {
4357 if(qs[i].size() == minimum) {
4358 if(qs[i].empty()) {
4359 rest[i] = t[next];
4360 }
4361 qs[i].push(next);
4362 next++;
4363 }
4364 }
4365 }
4366 for(int i = 0; i < n; i++) {
4367 int queue_time = current_time;
4368 while(!qs[i].empty() && queue_time < 540) {
4369 if(rest[i] != -1) {
4370 queue_time += rest[i];
4371 rest[i] = -1;
4372 } else {
4373 queue_time += t[qs[i].front()];
4374 }
4375 end_time[qs[i].front()] = queue_time;
4376 qs[i].pop();
4377 }
4378 }
4379 for(int i = 0; i < q; i++) {
4380 int query;
4381 cin >> query;
4382 const int time = end_time[query];
4383 if(time == -1) {
4384 cout << "Sorry" << endl;
4385 } else {
4386 const int h = time / 60;
4387 const int m = time % 60;
4388 cout << setw(2) << right << setfill('0') << h + 8
4389 << ':'
4390 << setw(2) << right << setfill('0') << m
4391 << endl;
4392 }
4393 }
4394 return 0;
4395 }
void qs(vector< int > &vec, int l, int r)
Definition: acwing.cpp:6299

引用了 acwing::acwing785::qs() , 以及 acwing::acwing1929::right.

被这些函数引用 TEST().

◆ TEST()

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

在文件 pat_test.cpp2059 行定义.

2059 {
2060 istringstream in("2 2 7 5\n"
2061 "1 2 6 4 3 534 2\n"
2062 "3 4 5 6 7");
2063 auto out = ostringstream();
2064 main(in, out);
2065 ASSERT_EQ("08:07\n"
2066 "08:06\n"
2067 "08:10\n"
2068 "17:00\n"
2069 "Sorry\n",
2070 out.str());
2071 }
int main(int argc, char **argv)
Definition: main.cpp:5

引用了 main().