第二周算法题

[NOIP2005 普及组] 陶陶摘苹果

题目描述

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 10 10 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 30 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知 10 10 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

  • 输入格式

输入包括两行数据。第一行包含 10 10 10 100 100 100 200 200 200 之间(包括 100 100 100 200 200 200 )的整数(以厘米为单位)分别表示 10 10 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 100 100 120 120 120 之间(包含 100 100 100 120 120 120 )的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

  • 输出格式

输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

  • 样例 #1

  • 样例输入 #1

100 200 150 140 129 134 167 198 200 111
110
  • 样例输出 #1
5
  • 提示

【题目来源】

NOIP 2005 普及组第一题

代码

apples_height = list(map(int, input().split()))
tao_height = int(input())
stool_height = 30

max_height = tao_height + stool_height

cnt = 0
for i in range(len(apples_height)):
    if apples_height[i] <= max_height:
        cnt += 1
print(cnt)

[NOIP2005 普及组] 校门外的树

题目描述

某校大门外长度为 l l l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 1 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 0 0 的位置,另一端在 l l l 的位置;数轴上的每个整数点,即 0 , 1 , 2 , … , l 0,1,2,\dots,l 0,1,2,,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

  • 输入格式

第一行有两个整数,分别表示马路的长度 l l l 和区域的数目 m m m

接下来 m m m 行,每行两个整数 u , v u, v u,v,表示一个区域的起始点和终止点的坐标。

  • 输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

  • 样例 #1

  • 样例输入 #1

500 3
150 300
100 200
470 471
  • 样例输出 #1
298
  • 提示

【数据范围】

  • 对于 20 % 20\% 20% 的数据,保证区域之间没有重合的部分。
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ l ≤ 1 0 4 1 \leq l \leq 10^4 1l104 1 ≤ m ≤ 100 1 \leq m \leq 100 1m100 0 ≤ u ≤ v ≤ l 0 \leq u \leq v \leq l 0uvl

【题目来源】

NOIP 2005 普及组第二题

代码

l, m = map(int, input().split())

road_trees = [1 for i in range(l+1)]
for i in range(m):
    u, v = map(int, input().split())
    for pos in range(u, v+1):
            road_trees[pos] = 0
print(sum(road_trees))

[NOIP2016 普及组] 回文日期

  • 题目背景

NOIP2016 普及组 T2

题目描述

在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

牛牛习惯用 8 8 8 位数字表示一个日期,其中,前 4 4 4 位代表年份,接下来 2 2 2 位代表月份,最后 2 2 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。

牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8 8 8 位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。

一个 8 8 8 位数字是回文的,当且仅当对于所有的 i i i 1 ≤ i ≤ 8 1 \le i \le 8 1i8)从左向右数的第 i i i 个数字和第 9 − i 9-i 9i 个数字(即从右向左数的第 i i i 个数字)是相同的。

例如:

  • 对于 2016 年 11 月 19 日,用 8 8 8 位数字 20161119 20161119 20161119 表示,它不是回文的。
  • 对于 2010 年 1 月 2 日,用 8 8 8 位数字 20100102 20100102 20100102 表示,它是回文的。
  • 对于 2010 年 10 月 2 日,用 8 8 8 位数字 20101002 20101002 20101002 表示,它不是回文的。

每一年中都有 12 12 12 个月份:

其中, 1 , 3 , 5 , 7 , 8 , 10 , 12 1, 3, 5, 7, 8, 10, 12 1,3,5,7,8,10,12 月每个月有 31 31 31 天; 4 , 6 , 9 , 11 4, 6, 9, 11 4,6,9,11 月每个月有 30 30 30 天;而对于 2 2 2 月,闰年时有 29 29 29 天,平年时有 28 28 28 天。

一个年份是闰年当且仅当它满足下列两种情况其中的一种:

  1. 这个年份是 4 4 4 的整数倍,但不是 100 100 100 的整数倍;
  2. 这个年份是 400 400 400 的整数倍。

例如:

  • 以下几个年份都是闰年: 2000 , 2012 , 2016 2000, 2012, 2016 2000,2012,2016

  • 以下几个年份是平年: 1900 , 2011 , 2014 1900, 2011, 2014 1900,2011,2014

  • 输入格式

两行,每行包括一个 8 8 8 位数字。

第一行表示牛牛指定的起始日期。

第二行表示牛牛指定的终止日期。

保证 d a t e 1 \mathit{date}_1 date1 d a t e 2 \mathit{date}_2 date2 都是真实存在的日期,且年份部分一定为 4 4 4 位数字,且首位数字不为 0 0 0

保证 d a t e 1 \mathit{date}_1 date1 一定不晚于 d a t e 2 \mathit{date}_2 date2

  • 输出格式

一个整数,表示在 d a t e 1 \mathit{date}_1 date1 d a t e 2 \mathit{date}_2 date2 之间,有多少个日期是回文的。

  • 样例 #1

  • 样例输入 #1

20110101
20111231
  • 样例输出 #1
1
  • 样例 #2

  • 样例输入 #2

20000101
20101231
  • 样例输出 #2
2
  • 提示

【样例说明】

对于样例 1,符合条件的日期是 20111102 20111102 20111102

对于样例 2,符合条件的日期是 20011002 20011002 20011002 20100102 20100102 20100102

【子任务】

对于 60 % 60 \% 60% 的数据,满足 d a t e 1 = d a t e 2 \mathit{date}_1 = \mathit{date}_2 date1=date2

代码

  • 思路一:遍历所有日期 (>_< 超时)
import datetime

def judge(s):  # 判断日期是否是回文串
    if s[:4] == s[-1:-5:-1]:
        return True
    return False

startTime = input()
endTime = input()

st = datetime.date(int(startTime[:4]), int(startTime[4:6]), int(startTime[6:]))
et = datetime.date(int(endTime[:4]), int(endTime[4:6]), int(endTime[6:]))
td = datetime.timedelta(1)

cnt = 0
while st <= et:
    nowTime = str(st.year) + '{:0>2d}'.format(st.month) + '{:0>2d}'.format(st.day)
    if judge(nowTime):
        cnt += 1

    st += td

print(cnt)

在这里插入图片描述

  • 思路二:提取年份,拼接成新日期(翻转拼接肯定是回文),判断新日期是否合法 (是否符合日期规则,是否是在指定时间范围内)(^_^ 全过,非常nice)
import datetime

startTime = input()
endTime = input()

st = datetime.date(int(startTime[:4]), int(startTime[4:6]), int(startTime[6:]))
et = datetime.date(int(endTime[:4]), int(endTime[4:6]), int(endTime[6:]))

year_st = int(startTime[:4])
year_ed = int(endTime[:4])
cnt = 0
for year in range(year_st, year_ed+1):
    try:
    	# 如果拼接的日期不合法,会报错,所以可以使用 try except来捕捉报错,使程序可以继续运行
        now_time = datetime.date(year, int(str(year)[-1:-3:-1]), int(str(year)[-3:-5:-1]))
        if now_time >= st and et >= now_time:
            cnt += 1
    except:
        pass

print(cnt)

[NOIP2018 普及组] 标题统计

题目描述

凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时,空格和换行符不计算在内。

  • 输入格式

输入文件只有一行,一个字符串 s s s

  • 输出格式

输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。

  • 样例 #1

  • 样例输入 #1

234
  • 样例输出 #1
3
  • 样例 #2

  • 样例输入 #2

Ca 45
  • 样例输出 #2
4
  • 提示

【输入输出样例 1 说明】
标题中共有 3 个字符,这 3 个字符都是数字字符。

【输入输出样例 2 说明】 标题中共有$ 5$ 个字符,包括 1 1 1 个大写英文字母, 1 1 1 个小写英文字母和 2 2 2 个数字字符, 还有 1 1 1 个空格。由于空格不计入结果中,故标题的有效字符数为 4 4 4 个。

【数据规模与约定】
规定 ∣ s ∣ |s| s 表示字符串 s s s 的长度(即字符串中的字符和空格数)。
对于 40 % 40\% 40% 的数据, 1 ≤ ∣ s ∣ ≤ 5 1 ≤ |s| ≤ 5 1s5,保证输入为数字字符及行末换行符。
对于 80 % 80\% 80% 的数据, 1 ≤ ∣ s ∣ ≤ 5 1 ≤ |s| ≤ 5 1s5,输入只可能包含大、小写英文字母、数字字符及行末换行符。
对于 100 % 100\% 100% 的数据, 1 ≤ ∣ s ∣ ≤ 5 1 ≤ |s| ≤ 5 1s5,输入可能包含大、小写英文字母、数字字符、空格和行末换行符。

代码

s = input()
s_new = ''.join(s.split())
print(len(s_new))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是丝豆呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值