NOIP 刷题计划:如何最大化刷题数量?
"NOIP 临近了,小 A 却发现他已经不会写题了。好在现在离竞赛还有一段时间,小 A 决定从现在开始夜以继日地刷题。也就是说小 A 废寝忘食,一天二十四小时地刷题。\n今天的日期(时间)是 yyyy 年 mm 月 dd 日 hh 时 min 分,考试的时间是 yyyy2 年 mm2 月 dd2 日 hh2 时 min2 分。这之间的所有时间小 A 都用来刷题了,那么考试之前他最多能刷多少题呢?注意哦,考虑闰年。\n时间紧张小 A 只管数量不管质量。当然有的题目容易一些,有的题目难一些。根据小 A 的经验,他能一眼看出写出某一个题目需要的时间,以分钟记。\n现在给出洛谷 Online Judge 的题目列表,请你挑出最多的题目使小A能在竞赛前写出来。\n我们假设从远古到未来,历法的表示与现在一样。\n输入格式\n第一行一个整数N,表示洛谷Online Judge的题目数,N≤5000。\n接下来N行,每行一个整数表示刷该题需要用的时间,以分钟记(≤10000)。(这个题本身是什么并不重要,不是么?小A已经写过题目数为0 个)。\n\n接下来两行依次是当前时间和竞赛时间。时间给出的格式是:yyyy-mm-dd-hh:min,例如:2007-06-23-02:00,采用 24 小时制,每天从 00:00 到 23:59 ,年份从0000到9999。\n\n输出格式\n一行,一个整数,NOIP 前最多刷的题目数。\n样例输入输出:\n输入 #1:\n2\n1\n1\n2007-06-23-11:59\n2007-06-23-12:00\n输出#1:\n1\n请用c++解题内容:以下是用C++编写的解题代码:\n\ncpp\n#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <string>\n#include <sstream>\n\nusing namespace std;\n\n// 定义时间结构体\nstruct Time {\n int year, month, day, hour, minute;\n};\n\n// 将时间字符串转换为Time结构体\nTime parseTime(const string& timeStr) {\n Time time;\n sscanf(timeStr.c_str(), "%d-%d-%d-%d:%d", &time.year, &time.month, &time.day, &time.hour, &time.minute);\n return time;\n}\n\n// 将Time结构体转换为分钟数\nint toMinutes(const Time& time) {\n return time.year * 525600 + time.month * 43800 + time.day * 1440 + time.hour * 60 + time.minute;\n}\n\n// 将分钟数转换为Time结构体\nTime toTime(int minutes) {\n Time time;\n time.year = minutes / 525600;\n minutes %= 525600;\n time.month = minutes / 43800;\n minutes %= 43800;\n time.day = minutes / 1440;\n minutes %= 1440;\n time.hour = minutes / 60;\n time.minute = minutes % 60;\n return time;\n}\n\nint main() {\n int n;\n cin >> n;\n\n vector<int> times(n);\n for (int i = 0; i < n; i++) {\n cin >> times[i];\n }\n\n string currentTimeStr, contestTimeStr;\n cin >> currentTimeStr >> contestTimeStr;\n\n Time currentTime = parseTime(currentTimeStr);\n Time contestTime = parseTime(contestTimeStr);\n\n int currentMinutes = toMinutes(currentTime);\n int contestMinutes = toMinutes(contestTime);\n\n sort(times.begin(), times.end());\n\n int maxProblems = 0;\n int totalMinutes = 0;\n for (int i = 0; i < n; i++) {\n totalMinutes += times[i];\n if (totalMinutes > contestMinutes - currentMinutes) {\n break;\n }\n maxProblems++;\n }\n\n cout << maxProblems << endl;\n\n return 0;\n}\n\n这段代码使用了vector来存储题目所需的时间,然后根据当前时间和竞赛时间计算出可以用来刷题的总时间,然后按照题目所需时间从小到大排序,依次累加题目所需时间,直到累加的时间超过了可以用来刷题的总时间为止,最后输出可以刷的题目数量。\n\n注意:这段代码没有考虑闰年的情况,如果需要考虑闰年的话,可以在转换时间的函数中添加相应的逻辑判断。\n
原文地址: https://www.cveoy.top/t/topic/pzwQ 著作权归作者所有。请勿转载和采集!