洛谷基础题练习10

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×ai3×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 代表你不应该叫地主。
  • 你可以输出字符串的任意大小写形式。例如:字符串 yesYesYES 均会被视为表示应该叫地主。

样例输入 #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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦里逆天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值