字符串与矩阵
[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 1≤l≤104, 1 ≤ m ≤ 100 1 \leq m \leq 100 1≤m≤100, 0 ≤ u ≤ v ≤ l 0 \leq u \leq v \leq l 0≤u≤v≤l。
【题目来源】
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 1≤i≤8)从左向右数的第 i i i 个数字和第 9 − i 9-i 9−i 个数字(即从右向左数的第 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 天。
一个年份是闰年当且仅当它满足下列两种情况其中的一种:
- 这个年份是 4 4 4 的整数倍,但不是 100 100 100 的整数倍;
- 这个年份是 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
1≤∣s∣≤5,保证输入为数字字符及行末换行符。
对于
80
%
80\%
80% 的数据,
1
≤
∣
s
∣
≤
5
1 ≤ |s| ≤ 5
1≤∣s∣≤5,输入只可能包含大、小写英文字母、数字字符及行末换行符。
对于
100
%
100\%
100% 的数据,
1
≤
∣
s
∣
≤
5
1 ≤ |s| ≤ 5
1≤∣s∣≤5,输入可能包含大、小写英文字母、数字字符、空格和行末换行符。
代码
s = input()
s_new = ''.join(s.split())
print(len(s_new))