P1167 刷题【洛谷算法习题】
P1167 刷题网页链接P1167 刷题题目描述NOIP 临近了小 A 却发现他已经不会写题了。好在现在离竞赛还有一段时间小 A 决定从现在开始夜以继日地刷题。也就是说小 A 废寝忘食一天二十四小时地刷题。今天的日期时间是 yyyy 年 mm 月 dd 日 hh 时 MM 分考试的时间是 yyyy2 年 mm2 月 dd2 日 hh2 时 MM2 分。这之间的所有时间小 A 都用来刷题了那么考试之前他最多能刷多少题呢注意哦考虑闰年。时间紧张小 A 只管数量不管质量。当然有的题目容易一些有的题目难一些。根据小 A 的经验他能一眼看出写出某一个题目需要的时间以分钟记。现在给出洛谷 Online Judge 的题目列表请你挑出最多的题目使小A能在竞赛前写出来。我们假设从远古到未来历法的表示与现在一样。输入格式第一行一个整数N NN表示洛谷 Online Judge 的题目数N ≤ 5000 N≤5000N≤5000。接下来N NN行每行一个整数表示刷该题需要用的时间以分钟记$ \le 10000$。这个题本身是什么并不重要不是么小A已经写过题目数为0 00个。接下来两行依次是当前时间和竞赛时间。时间给出的格式是yyyy-mm-dd-hh:MM例如2007-06-23-02:00采用24 2424小时制每天从 00:00 到 23:59年份从0000 00000000到9999 99999999。输出格式一行一个整数NOIP 前最多刷的题目数。输入输出样例 #1输入 #12 1 1 2007-06-23-11:59 2007-06-23-12:00输出 #11解题思路本题核心是时间精准换算贪心算法求解最大刷题数量。首先解析起始、结束时间将年、月、日、时、分统一转换为总分钟数计算可用刷题总时间过程中需判断闰年修正2月天数。将所有题目按刷题耗时升序排序采用贪心策略优先选择耗时最短的题目能在总时间内刷出最多题目。依次累加题目耗时直到剩余时间不足以刷下一题统计最终可刷题目数量。算法时间复杂度为O ( n log n ) O(n\log n)O(nlogn)精准处理历法规则与时间计算完美适配题目要求。总结核心逻辑将时间差换算为总分钟数贪心选择耗时最短的题目最大化刷题数量。关键操作闰年判断、时间格式解析与分钟换算、题目排序贪心累加。效率保障排序处理题目耗时线性遍历统计精准适配历法与时间计算规则。代码内容#includebits/stdc.husingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N5e310;constll p1e97;constll INF1e18;constll M1e610;ll m[N];ll day[13]{0,31,28,31,30,31,30,31,31,30,31,31,30};ll a[10],b[10];boolfind(ll x){if(x%1000x%4000)return1;elseif(x%40)return1;return0;}intmain(){ll n;cinn;for(ll i1;in;i)cinm[i];sort(m1,mn1);scanf(%d-%d-%d-%d:%d,a[1],a[2],a[3],a[4],a[5]);scanf(%d-%d-%d-%d:%d,b[1],b[2],b[3],b[4],b[5]);ll t0;for(ll ia[1];ib[1];i){if(find(i))t-366;elset-365;}for(ll i1;ia[2];i)tday[i];for(ll i1;ib[2];i)t-day[i];if(find(a[1])a[2]2)t;if(find(b[1])b[2]2)t--;ta[3];t-b[3];t*1440;t60*a[4]a[5];t-60*b[4]b[5];t*-1;ll ans0;for(ll i1;in;i){if(tm[i])t-m[i],ans;elsebreak;}coutansendl;return0;}