洛谷 P1167 刷题

洛谷传送门

题目描述

noip临近了,小A却发现他已经不会写题了。好在现在离竞赛还有一段时间,小A决定从现在开始夜以继日地刷题。也就是说小A废寝忘食,一天二十四小时地刷题。

今天的日期(时间)是yyyyyyy**y年mmm**m月ddd**d日hhh**h时minmin分,考试的时间是yyyyyyy**y'年mmm**m'月ddd**d'日hhh**h'时minmin'分。这之间的所有时间小A都用来刷题了,那么考试之前他最多能刷多少题呢?注意哦,考虑闰年。

时间紧张小A只管数量不管质量。当然有的题目容易一些,有的题目难一些。根据小A的经验,他能一眼看出写出某一个题目需要的时间,以分钟记。

现在给出洛谷Online Judge的题目列表,请你挑出最多的题目使小A能在竞赛前写出来。

我们假设从远古到未来,历法的表示与现在一样。

输入格式

第一行一个整数NN,表示洛谷Online Judge的题目数,N≤5000N≤5000。

接下来NN行,每行一个整数表示刷该题需要用的时间,以分钟记(\le 10000≤10000)。(这个题本身是什么并不重要,不是么?小A已经写过题目数为00个)。

接下来两行依次是当前时间和竞赛时间。时间给出的格式是:yyyy-mm-dd-hh:minyyy**ym**md**dh**h:min,例如:2007-06-23-02:002007−06−23−02:00,采用2424小时制,每天从00:00~23:59,年份从00000000到99999999。

输出格式

一行,一个整数,noip前最多刷的题目数。

输入输出样例

输入 #1复制

输出 #1复制

题解:

一道模拟题,加了一点点的贪心。

其实这题的贪心非常好想,就是时间少的先来,直接排序扫就可以。

带着这个思路,我们过来写代码:

然后我们发现我们卡在时间的处理上了...果然我还是蒟蒻

所以我在这里主要介绍一下这些“日期题”的处理技巧。

首先是读入,针对于这种读入,我们用字符串处理再从字符串中提取实在是麻烦的要命。所以我们直接用一种简化的方式:

scanf("%d-%d-%d-%d:%d",&start[1],&start[2],&start[3],&start[4],&start[5]);
scanf("%d-%d-%d-%d:%d",&endd[1],&endd[2],&endd[3],&endd[4],&endd[5]);

不用担心这种方法会爆锅,根本不可能,简单好用,骗分首选。

读入完事了,接下来我们需要把这个时间段处理成分钟数(这样才能贪心)。

我给大家介绍两种方法把这个时间段分钟数处理出来。

第一种做法:

我们以0000年1月1日的00:00分做基准线(也不知道这时候基督这小家伙出生没),分别用起始日期和结束日期减去这个基准,然后就处理出了这个时间段(有一点点前缀和的味道)

然鹅我并没有这么做

第二种做法:

实在是惭愧,本蒟蒻只能想到最朴实无华的模拟方法。你想啊,我们可以先处理出天数然后×1440(24*60,一天的分钟数),然后再处理每天的分钟。

然后我们又想到,可不可以逐次处理年月日,最后再一点点的多退少补(注意这4个字!!)呢?

当然可以!!

我们先从起始年到终止年(注意不能<=终止年而要减去1即<终止年,下同)

如果是闰年就加上366天,否则加365天。

然后我们会发现,我们多处理了起始年的前半年,少处理了终止年的前半年。

这就是多退少补的思想了。先判闰年,用两个月份数组处理。

同理,我们多处理了起始月的前半个月,少处理了终止月的前半个月。

所以我们继续多退少补。

最后处理小时和分钟。

贪心的部分我就不讲了,这道题的难点已经说完了,这道题的贪心如果想不出来还是退役多练练吧。

注意一下:我一开始WA了两个大数据的点,是因为最后输出的时候,直接在else里输出,这样如果是极大数据的话,根本就进不去else那里,导致输出为空,请大家引以为戒。

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,time,ans;
int a[5010];
int m1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int m2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int start[10],endd[10];
bool check(int x)
{
if((x%4==0 && x%400!=0) || x%400==0)
return 1;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
scanf("%d-%d-%d-%d:%d",&start[1],&start[2],&start[3],&start[4],&start[5]);
scanf("%d-%d-%d-%d:%d",&endd[1],&endd[2],&endd[3],&endd[4],&endd[5]);
for(int i=start[1];i<endd[1];i++)
{
if(check(i))
time+=366;
else
time+=365;
}
if(check(start[1]))
for(int i=1;i<start[2];i++)
time-=m2[i];
else
for(int i=1;i<start[2];i++)
time-=m1[i];
if(check(endd[1]))
for(int i=1;i<endd[2];i++)
time+=m2[i];
else
for(int i=1;i<endd[2];i++)
time+=m1[i];
for(int i=1;i<start[3];i++)
time--;
for(int i=1;i<endd[3];i++)
time++;
time=time*24*60;
time-=60*start[4]+start[5];
time+=60*endd[4]+endd[5];
for(int i=1;i<=n;i++)
{
if(time>=a[i])
{
time-=a[i];
ans++;
}
else
break;
}
printf("%d",ans);
return 0;
}

洛谷 P1167 刷题的更多相关文章

  1. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...

  2. 洛谷P5274 优化题(ccj)

    洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...

  3. 洛谷 P4148 简单题 KD-Tree 模板题

    Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...

  4. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  5. [洛谷U22157]刷水题(数位dp)(hash)

    题目背景 做正经题是不可能做正经题的,这辈子都不可能做正经题的,毒瘤题又不会做毒瘤题,就是水题这种东西,才维持了蒟蒻的信心: 题目描述 这里有N+1 道水题,编号分别为0 ~N+1 ,每道水题都有它自 ...

  6. 山东省济南市历城第二中学——洛谷图论入门题--基本题必做 图的遍历—3.骑马修栅栏(fence)

    由于我这个破题提交了十四五遍,所以我决定写篇博客来记录一下. 这个题的题目描述是这样的 首先一看这个题我瞬间就想到了一笔画问题(欧拉回路). 对于能够一笔画的图,我们有以下两个定理. 定理1:存在欧拉 ...

  7. 【最大流ISAP】洛谷P3376模板题

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  8. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  9. A 洛谷 P3601 签到题 [欧拉函数 质因子分解]

    题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...

随机推荐

  1. windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

      1.情景展示 java虚拟机占用这么高的CPU,肯定不正常! 2.原因分析 第一个是tomcat,正在运行java项目: 第二个是eclipse,因为eclipse的运行依赖于java. 现在的问 ...

  2. Windows&Mac安装Redis

    Windows&Mac安装Redis Window 下安装Redis Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我下载 Redis-x64-xxx.zi ...

  3. Qt Quick 常用元素:ComboBox(下拉列表) 与 ProgressBar(进度条)

    一.ComboBox ComboBox,即下拉列表框,由一个列表框和一个标签控件(或编辑控件)组成.ComboBox 的下拉列表是使用 Menu 实现的,列表内的每个条目对应一个 Menultem. ...

  4. 大话设计模式Python实现-策略模式

    策略模式(Strategy Pattern):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 下面是一个商场活动的实现 #!/usr/bin/e ...

  5. Docker remote API

    Docker remote API 该教程基于Ubuntu或Debian环境,如果不是,请略过本文 Docker API 在Docker生态系统中一共有三种API Registry API:提供了与来 ...

  6. SpringBoot 基于web应用开发(请求参数获取,静态资源,webjars)

    SpringBoot 基于web应用开发 一.Lombok使用 1.导入依赖库 <dependency>    <groupId>org.projectlombok</g ...

  7. 获取Url地址中参数的3种方法【华为云技术分享】

    获取Url的代码如下:window.location.href; 方法一:原生js(假设已经获得了Url地址) var url = 'https://gitbook.cn/gitchat/geekbo ...

  8. 使用Fiddler抓取手机APP数据包--360WIFI

    使用Fiddler抓取手机APP流量--360WIFI 操作步骤:1.打开Fiddler,Tools-Fiddler Options-Connections,勾选Allow remote comput ...

  9. Git基础和入门

    一.Git基础概念 Git功能简单概述 可以随时回滚到之前的代码版本(git reset --hard ): 协同开发时不会覆盖别人的代码(分支): 留下修改记录(git log): 发版时可以方便的 ...

  10. css1.0~3.0背景图使用多张折叠的概念与方法

    需求:使用多张图片作为页面的背景图: 首先需要了解background的属性以及细节知识:https://www.cnblogs.com/chenglj/p/7372996.html backgrou ...