1. Hanoi双塔问题
题目描述
给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。
现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
输入格式
一个正整数n(1 ≤ n ≤ 200),表示在A柱上放有2n个圆盘。
输出格式
一个正整数, 为完成上述任务所需的最少移动次数An。
样例输入 #1
1
样例输出 #1
2
样例输入 #2
2
样例输出 #2
6
def hanoi(n):
if n == 2:
count = 2
else:
count = hanoi(n - 2) * 2 + 2
return count
n = int(input().strip())
print(hanoi(n * 2))
2. 生日
题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。
输入格式
输入共有 2 行,
第 1 行为 OI 组总人数 n(1 < n < 100);
第 2 行至第 n+1 行分别是每人的姓名 s(1 ≤ ∣s∣ <20)、出生年 y、月 m、日 d。(保证年月日实际存在,且年份∈[1960,2020]。)
输出格式
输出共有 n 行,
即 n 个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
样例输入
3 Yangchu 1992 4 23 Qiujingya 1993 10 13 Luowen 1991 8 1
样例输出
Luowen Yangchu Qiujingya
n = int(input().strip())
students = {}
if 1 < n < 100:
for i in range(n):
text = input().strip().split()
s, y, m, d = text
if 1 <= len(s) < 20 and 1960 <= int(y) <= 2020:
birth = y + m.rjust(2, '0') + d.rjust(2, '0')
if birth not in students.keys():
# 将生日作为键,将姓名添加进列表
students[birth] = [s]
else:
# 将生日相同的学生添加进同一列表
students[birth].append(s)
# 按键排序
list_students = sorted(students.items(), key=lambda x: int(x[0]))
for i in list_students:
# 数组逆序输出
for s in i[1][::-1]:
print(s)
3. Fergusonball Ratings(黄金球员)
题目描述
现在有一个球队需要你评价。
球队中的第 i 个人进了 ai 个球,犯规了 bi次。
所以第 i 个人的分数就是:
5 × a i − 3 × b i 5\times a_i-3\times b_i 5×ai−3×bi
如果第 i 个人的分数大于 40 ,那么这个人就是一个黄金球员。相对应的,如果这个球队的所有人都是黄金球员,那么这个球队就是一个黄金球队。
输入格式
第一行一个整数 n(1 ≤ n ≤ 20) ,表示球队的人数。
接下来 2n 行,第 2i - 1 行表示 ai,第 2 i 行表示 bi 。(1 ≤ ai,bi ≤ 2000)
输出格式
共一行,表示黄金球员的数量。如果这是一个黄金球队,请再输出一个
+
。样例输入 #1
3 12 4 10 3 9 1
样例输出 #1
3+
样例输入 #2
2 8 0 12 1
样例输出 #2
1
n = int(input().strip())
count = 0
list_a = []
list_b = []
for i in range(1, 2 * n + 1):
num = int(input())
if i % 2 != 0:
list_a.append(num)
else:
list_b.append(num)
for i in range(n):
if list_a[i] * 5 - list_b[i] * 3 > 40:
count += 1
ch = '+' if count == n else ''
print(f'{count}{ch}')
4. Cupcake Party(剩几个蛋糕)
题目描述
幼儿园有 28 个小朋友,因此需要 28 个蛋糕。
一个大盒子可以装 8 块蛋糕,一个小盒子可以装 3 块蛋糕。现在有 n 个大盒子和 m 个小盒子,现在给每个小朋友一块蛋糕,问能剩下几个?
输入格式
一行,两个整数 n,m(0 ≤ n,m ≤ 100),具体意义见题目描述。
输出格式
一行,表示剩余蛋糕的数量。
样例输入 #1
2 5
样例输出 #1
3
样例输入 #2
2 4
样例输出 #2
0
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin>>n>>m;
int total = n * 8 + m * 3;
if (total > 28)
cout<<total-28;
else
cout<<0;
return 0;
}
5. MORTADELA(最便宜的肉肠)
题目描述
全国连锁超市(NSC)喜欢吹嘘它们的意式肉肠是全国最低的。
实际上,如果顾客打算在其他连锁超市里找到更便宜的肉肠,那么 NSC 会向其补上差价。
Matej 和 Filip 决定接受这个挑战。他们将会挨个走访 N 家不同连锁店,来找到不仅比 NSC 便宜的熟香肠,而且在市场上最便宜的。如果他们成功了,他们就可以在他们学校附近的 NSC 分店买到最便宜的香肠。
NSC 希望没有人能找到更便宜的香肠,因为所有所有连锁超市(包括 NSC)都以一种复杂的方式表示香肠的价格:X 元 Y 克香肠。
请编写一个程序,给定 NSC 与其余 N 家连锁店中的香肠价格,求 Matej 和 Filip 必须为靠近学校的 NSC 中的
1000 克
熟香肠支付的价格。输入格式
第一行两个正整数 XNSC(1≤XNSC≤100) 和 YNSC (1≤YNSC≤103),表示 XNSC 是在 NSC 连锁店中 YNSC 克香肠的价格。
第二行一个正整数 N (1 ≤ N ≤ 100),表示连锁店的数目(不包括 NSC)。
接下来 N 行,每行两个正整数 Xi,Yi (Xi ≤ 100,Yi ≤ 103),表示 Xi是在第 i 家连锁店中 Yi 克香肠的价格。
输出格式
输出仅一行,一个实数,表示结果,保留 2 位小数。
样例输入 #1
5 100 3 4 100 3 100 7 100
样例输出 #1
30.00
样例输入 #2
13 6 5 56 679 35 120 99 999 56 73 37 532
样例输出 #2
69.55
样例输入 #3
100 5 3 99 8 65 14 78 10
样例输出 #3
4642.86
x_nsc, y_nsc = map(int, input().strip().split())
price_nsc = x_nsc * 1.0 / y_nsc
prices = [price_nsc]
n = int(input().strip())
for i in range(n):
x_i, y_i = map(int, input().strip().split())
price_i = x_i * 1.0 / y_i
prices.append(price_i)
min_price = sorted(prices)[0]
print('{:.2f}'.format(min_price * 1000))
6. 幻想乡扑克游戏
题目描述
斗地主是一种使用 A 到 K 加上大小王的共 54 张扑克牌来进行的游戏,其中大小王各一张,其它数码牌各四张。在斗地主中,牌的大小关系根据牌的数码表示如下:
3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A < 2 < 小王 < 大王 \tt 3<4<5<6<7<8<9<10<J<Q<K<A<2<{\text{小王}}< \text{大王} 3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王
且牌的大小关系和花色无关。游戏开始时,将会给 3 名玩家各自发放 17 张牌作为手牌,余下三张作为底牌。玩家会将牌从大到小排序理好,然后根据自己牌型的好坏程度来选择是否叫地主。
你认为,如果自己的手牌中存在王炸(即大小王各一张)或者至少一个炸弹(即四张数码相同的牌),则你会选择叫地主。
请实现一个程序来判断你是否应该叫地主。
输入格式
本题包含多组数据。
- 第一行输入一个整数 T(1≤T≤104),表示数据组数。
- 接下来 T 行,每行输入一个长度为 17 的字符串,表示你的手牌。保证牌已经预先理好。在输入中使用 T 代表点数为 10 的牌,使用 X 代表小王,使用 D 代表大王。
输出格式
- 输出共 T 行。
- 对于每组数据,输出一行一个字符串:
yes
代表你应该叫地主。no
代表你不应该叫地主。- 你可以输出字符串的任意大小写形式。例如:字符串
yes
、Yes
、YES
均会被视为表示应该叫地主。样例输入 #1
3 X2AAKKKKQT9765433 DX22AKKQJTT884443 X2AAAKQQJT8554433
样例输出 #1
Yes Yes No
t = int(input().strip())
for i in range(t):
flag1 = False
flag2 = False
cards = input().strip()
if 'X' in cards and 'D' in cards:
flag1 = True
for i in cards:
if cards.count(i) == 4:
flag2 = True
if flag1 or flag2:
print('Yes')
else:
print('No')
7. 标题计数
题目描述
Markdown 是一种标记语言。在 Markdown 中,若一行的第一个非空白字符是井号(#),且紧跟着若干个空格,则这一行剩余的非空白内容将会按照一级标题渲染。
在本题范围内,下面的都是一级标题:
# This is a title # This is another title # This is also a title # You#can#add#more#sharps # #
在本题范围内,下面的都不是一级标题:
<h1>an HTML title</h1> #You should insert a space ## This is a secondary title aaaaa # This is not a title at all # You should add something after the sharp sign
给定一段多行文本,求出这段文本总共有多少个一级标题。(总文本不超过 100 个字符,不超过 10 行。文本中只有英文字母,井号(
#
),换行符(Line Feed,LF,\n
)和空格。)输入格式
第一行输入一个整数 n,代表文本的行数。
接下来输入 n 行,是给出的标记文本。
输出格式
输出一行一个整数,为这段文本中的一级标题个数。
样例输入 #1
1 #u#n#t#i#t#l#e#d#
样例输出 #1
0
样例输入 #2
1 # a perfect title
样例输出 #2
1
样例输入 #3
10 # a # b ## c #d # e # f#g#h#i#j ##k # # l # m
样例输出 #3
4
n = int(input().strip())
count_title = 0
for i in range(n):
# 去掉首尾空格
line = input().strip()
# print(line)
if len(line) > 1:
if line.startswith('#'):
if line[1].isspace():
count_title += 1
print(count_title)