喵睡觉的时段是连续的,即一旦喵喵开始睡觉了,就不能被打扰。 可以假设喵喵必须要睡眠连续不少于 A 个小时,即一旦喵喵开始睡觉了,至少连续 A 个小时内(即 A×60 分钟内)不能被打扰! 喵不能连续活动超过 B 个小时。 喵要看新番,播放时间它已经贴在床头啦(每天都用同一张时间表),这段时间它必须醒着!! 求安排睡眠时间。
Input
多组数据,每组数据的格式如下: 第 1 行输入三个整数,A 和 B 和 N (1 ≤ A ≤ 24, 1 ≤ B ≤ 24, 1 ≤ n ≤ 20) 第 2 到 N + 1 行为每日的新番时间表,每行一个时间段,格式形如 hh:mm-hh:mm (闭区间),这是一种时间格式,hh:mm 的范围为 00:00 到 23:59。注意一下,时间段是保证不重叠的,但是可能出现跨夜的新番,即新番的开始时间点大于结束时间点。 保证每个时间段的开始时间点和结束时间点不一样,即不可能出现类似 08:00-08:00 这种的时间段。时长的计算由于是闭区间所以也是有点坑的,比如 12:00-13:59 的时长就是 120 分钟。 不保证输入的新番时间表有序。
Output
输出的第一行是 Yes 或者 No,代表是否存在满足猫猫要求的时间管理办法。 第2行输出一个整数 k,代表当天有多少个时间段要睡觉 接下来 k 行是喵喵的睡觉时间段,每行一个时间段,格式形如 hh:mm-hh:mm (闭区间),这个在前面也有定义。注意一下,如果喵喵的睡眠时段跨越当天到达了明天,比如从23点50分睡到0点40分,那就输出23:50-00:40,如果从今晚23:50睡到明天早上7:30,那就输出23:50-07:30。 本题是 Special Judge。
bool overWake = false; vector<int> sT; for (int i = 0; i != ve.size(); i++) { theTime curTime = ve[i]; if ((curTime.end - curTime.begin + 1) > b * 60) { overWake = true; break; } sT.push_back(curTime.begin - 1); sT.push_back(curTime.end + 1); } vector<theTime> ans; if (overWake || sT.empty()) { ans.clear(); return ans; } int ta = sT.back(); int tb = sT[0] + 24 * 60; if (tb - ta + 1 < a * 60) { ans.clear(); return ans; } else { theTime ax(ta, tb); ans.push_back(ax); } for (int i = 1; i != sT.size() - 1; i++) { int ta = sT[i]; i++; int tb = sT[i]; if ((tb - ta) < a * 60) { ans.clear(); break; } else { theTime ax(ta, tb); ans.push_back(ax); } } return ans; }
voidoutTime(int t){ int m = t % 60; int h = t / 60; if (h >= 24) h -= 24; cout << setw(2) << setfill('0') << h << ":"; cout << setw(2) << setfill('0') << m; }
intmain(){ int a, b, n; while (!(cin >> a >> b >> n).eof()) { vector<theTime> v; for (int i = 0; i < n; i++) { int h1, m1, h2, m2; char temp; cin >> h1 >> temp >> m1 >> temp >> h2 >> temp >> m2; int t1 = h1 * 60 + m1; int t2 = h2 * 60 + m2; if (t2 < t1) t2 += (24 * 60); theTime tt(t1, t2); v.push_back(tt); } sort(v.begin(), v.end()); vector<theTime> v1 = solve(a, b, v); if (v1.empty()) cout << "No" << endl; else { cout << "Yes" << endl; cout << v1.size() << endl; for (int i = 0; i != v1.size(); i++) { outTime(v1[i].begin); cout << "-"; outTime(v1[i].end); cout << endl; } } } return0; }