洛谷基础题练习13

1. KINO(使用杯座人数的最大值)

题目描述

电影院的每排有 N 个座位。座位分为普通座位(S)和爱心座位( L)。其中,爱心座位总是两两出现

每排座位的相邻的两个座位之间都设有一个杯架(除了两个爱心座位之间外)。特别地,一排座位的两侧也都设有杯架。如座位情况为:

SLLLLSSLL时,若用 * 来表示杯座,那么座位情况如下:
*   S   *   L   L   *   L   L   *   S   *   S   *   L   L   * \texttt{* S * L L * L L * S * S * L L *} * S * L L * L L * S * S * L L *
现有 N 位顾客坐满这 N 个座位,求最多有多少人能够使用杯座。

输入格式

第一行,一个整数 N(1 ≤ N ≤ 50)。

第二行,N 个字符 S/L,分别表示普通座位和爱心座位。

输出格式

输出能够使用杯座人数的最大值。

样例输入#1

3
SSS

样例输出#1

3

样例输入#2

4
SLLS

样例输出#2

4

样例输入#3

9
SLLLLSSLL

样例输出#3

7
n = int(input().strip())
seats = input().strip()
s = seats.count('S')
l = seats.count('LL')
result = s + l + 1
result = min(n, result)
print(result)

2. SPAVANAC(45分钟前的时间)

题目描述

给定 24 小时制下的时间 H:M,输出 24 小时制下比该时间早 45 分钟对应的时刻。

输入格式

第一行,两个正整数 H(0 ≤ H ≤ 23),M(0 ≤ M ≤ 59)。

输出格式

输出两个整数,表示早 45 分钟后的时刻。

样例输入#1

10 10

样例输出#1

9 25

样例输入#2

0 30

样例输出#2

23 45

样例输入#3

23 40

样例输出#3

22 55
H, M = map(int, input().strip().split())
# 将时间转成分钟
minutes = H * 60 + M
before = minutes - 45
before_h = before // 60
before_h = before_h
before_m = before - before_h * 60
print((before_h + 24) % 24, before_m)

3. YODA(整数碰撞)

题目描述

当两个整数碰撞时会发生什么?先将数位较少的数前不断添加前导 0 直到和数位较高的数的数位数量相同为止。然后,从两个数的最低位开始,每次将两个数的对应数位进行比较,并删去较小的那个数位(如果这两个数位相等则不执行任何操作),不断向高数位执行上述操作,直到最高位为止。此时,将这两个数中没有删去的数位按顺序依次拼接,可以得到两个新数。

例如,对于 456328 和 284315 这两个数,这两个的碰撞过程如下所示:

4 5 6 3 2 8
2 8 4 3 1 5

不难看出,碰撞之后得到的两个新数为 46328 和 83。

现在给定两个数 n,m(1⩽n,m⩽109),请求出这两个数进行碰撞之后分别得到的新数。如果某个数在进行碰撞之后,其数位都已经被删空了,则在输出中输出一行字符串 YODA。具体见『输出格式』部分。

输入格式

第一行输入一个整数 n,表示要进行碰撞的第一个数。
第二行输入一个整数 m,表示要进行碰撞的第二个数。

输出格式

输出共两行。

第一行中,如果 n 的数位已经删空,则输出一个字符串 YODA,否则输出一个整数,表示 n 进行碰撞后得到的新数。
第二行中,如果 m 的数位已经删空,则输出一个字符串 YODA,否则输出一个整数,表示 m 进行碰撞后得到的新数。

样例输入#1

300
500

样例输出#1

0
500

样例输入#2

65743
9651

样例输出#2

673
95

样例输入#3

2341
6785

样例输出#3

YODA
6785
n = input().strip()
m = input().strip()
# 取位数较多的长度
len_max = max(len(n), len(m))
# 将数位较少的数前不断添加前导0,直到和数位较高的数的数位数量相同为止
n = n.rjust(len_max, '0')
m = m.rjust(len_max, '0')
str_n = ""
str_m = ""
# 从两个数的最低位开始
for i in range(len_max-1, -1, -1):
    # 将两个数的对应数位进行比较,并拼接较大的那个数位
    if int(n[i]) > int(m[i]):
        str_n += n[i]
    # 如果这两个数位相等则直接拼接
    if int(n[i]) == int(m[i]):
        str_n += n[i]
        str_m += m[i]
    if int(n[i]) < int(m[i]):
        str_m += m[i]
# 判断是否删空
if len(str_n) == 0:
    print("YODA")
else:
    print(int(str_n[::-1]))
if len(str_m) == 0:
    print("YODA")
else:
    print(int(str_m[::-1]))

4. Kaucuk(标题序号及名称)

题目描述

Kaučuk 程序只有下列三种命令:

  • section:创建新的一级标题,序号从 1 开始标记。
  • subsection:创建新的二级标题,序号在每个一级标题的基础上从 1 开始标记。
  • subsubsection:创建新的三级标题,序号在每个二级标题的基础上从 1 开始标记。

给定 n 组命令及标题名称,输出所有标题序号及其名称。

输入格式

第一行一个正整数 n(n ≤ 100),表示命令的数量。

接下来的 n 行,每行输入命令名称(sectionsubsectionsubsubsection 之一)和标题名称。标题名称由不超过20个小写英文字母组成。

输出格式

共 n 行,表示所有标题序号及其名称。

样例输入#1

3
section zivotinje
section boje
section voce

样例输出#1

1 zivotinje
2 boje
3 voce

样例输入#2

4
section zivotinje
subsection macke
subsection psi
subsubsection mops

样例输出#2

1 zivotinje
1.1 macke
1.2 psi
1.2.1 mops

样例输入#3

4
section zivotinje
subsection psi
section voce
subsection ananas

样例输出#3

1 zivotinje
1.1 psi
2 voce
2.1 ananas
n = int(input().strip())
section = 0
subsection = 0
subsubsection = 0
for i in range(n):
    level, command = input().strip().split()
    if level == 'section':
        section += 1
        subsection = 0
    if level == 'subsection':
        subsection += 1
        subsubsection = 0
    if level == 'subsubsection':
        subsubsection += 1
    title = str(section)
    if subsection != 0:
        title += '.' + str(subsection)
        if subsubsection != 0:
            title += '.' + str(subsubsection)
    print(title, command)

5. FAKTOR

题目描述

给定 A,I,求一个最小的 N,使得
⌈ N A ⌉ ≥ I \lceil\frac{N}{A}\rceil\geq I ANI
输入格式

一行两个整数 A,I(1 ≤ A,I ≤ 100)。

输出格式

一行一个整数 N。

样例输入#1

38 24

样例输出 #1

875

样例输入#2

1 100

样例输出#2

100

样例输入#3

10 10

样例输出 #3

91
import math

"""
向下取整的运算称为Floor,用数学符号⌊⌋表示;向上取整的运算称为Ceiling,用数学符号⌈⌉表示
"""
A, I = map(int, input().strip().split())
if 1 <= A <= 100 and 1 <= I <= 100:
    if I == 1:
        print(A)
    else:
        for k in range(A * (I-1), (A * I) + 1):
            if math.ceil(k / A) >= I:
                print(k)
                break

6. Bus(车上的初始人数)

题目描述

公交车上初始有n 个人,每停一站,车上会先下去一个人,然后再下去车上剩下的人数的一半的人。已知经过了 k 个站之后,车上没人了。现在,给出 k(1 ≤ k ≤ 30),求一开始车上的人数 n。

输入格式

第一行为测试数据个数 T.

随后的T行为k的值

输出格式

每一行为给定的k对应的车上的初始人数.

样例输入

2
1
3

样例输出

1
7
n = int(input().strip())
for i in range(n):
    k = int(input().strip())
    count = 1
    while k > 1:
        count = count * 2 + 1
        k -= 1
    print(count)

7. JACK(最大和)

题目描述

给定 n 个正整数 a1 … an,请从中选择 3 个数字,满足他们的和不大于给定的整数 m,请求出这个和最大可能是多少。

输入格式

第一行有两个整数,分别表示数字个数 n (1≤n≤100)和给定的整数 m(6 ≤ m ≤ 3×105)。

第二行有 n 个整数,表示给定的 n 个数字 ai(1 ≤ ai ≤ 105)。

输出格式

输出一行一个整数表示答案。

样例输入#1

5 21
5 6 7 8 9

样例输出#1

21

样例输入#2

10 500
93 181 245 214 315 36 185 138 216 295

样例输出#2

497
n, m = map(int, input().strip().split())
nums = [int(i) for i in input().strip().split()]
sum = 0
for i in range(n-2):
    for j in range(i+1, n-1):
        for k in range(j+1, n):
            temp = nums[i] + nums[j] + nums[k]
            if m >= temp >= sum:
                sum = temp
print(sum)

8. ZBROJ(最大和、最小和)

题目描述

老师给了 Perica 两个数 a, b,Perica 将他们抄在了笔记本上,并要算出他们的和。

在抄写过程中,Perica 可能会将 a, b 中的数字 6 错抄成数字 5,也可能将数字 5 错抄成数字 6,当然也可能不抄错。

给定 a, b,请求出 Perica 算出的和最小和最大分别是多少。

输入格式

输入只有一行两个整数,分别表示 a 和 b(1 ≤ a,b ≤ 106)。

输出格式

输出一行两个整数,表示最小可能的和以及最大可能的和。

样例输入#1

11 25

样例输出#1

36 37

样例输入#2

1430 4862

样例输出#2

6282 6292

样例输入#3

16796 58786

样例输出#3

74580 85582
a, b = map(str, input().strip().split())
min_a = a.replace('6', '5')
min_b = b.replace('6', '5')
max_a = a.replace('5', '6')
max_b = b.replace('5', '6')
min_num = int(min_a) + int(min_b)
max_num = int(max_a) + int(max_b)
print(min_num, max_num)

9. VAUVAU(有几条暴躁的狗)

题目描述

在一个小村子里,邮递员、送奶工、垃圾清理工每天早晨都面临着同样的难题:18 号房子的门前有两条看门狗。他们所不知道的是,这两条狗的表现是有迹可循的。

当一天开始时,其中一条狗会先暴躁 a 分钟,然后安静 b 分钟,而另一条狗则会先暴躁 c 分钟,然后安静 d 分钟。这两条狗在一天中会无限地重复上述行为。

给定这三个人到达 18 号房子的时刻,请求出该时刻有几条狗是处于暴躁状态的。

输入格式

第一行有四个整数,分别表示 a, b, c, d,其意义见【题目描述】。

第二行有三个整数,分别表示邮递员到达的时刻 p,送奶工到达的时刻 m 和垃圾清理工到达的时刻 g。(1≤a,b,c,d,p,m,g<103

输出格式

输出三行每行一个字符串,依次表示邮递员、送奶工、垃圾清理工到达时有几条狗处于暴躁状态。

  • 如果没有狗处于暴躁状态,输出 none
  • 如果恰好有一条狗处于暴躁状态,输出 one
  • 如果两条狗都处于暴躁状态,输出 both

样例输入#1

2 2 3 3
1 3 4

样例输出#1

both
one
none

样例输入#2

2 3 4 5
4 9 5

样例输出#2

one
none
none
count = 0
# 一条狗会先暴躁 a 分钟,然后安静 b 分钟
# 另一条狗则会先暴躁 c 分钟,然后安静 d 分钟
a, b, c, d = map(int, input().strip().split())
# 邮递员到达的时刻 p,送奶工到达的时刻 m 和垃圾清理工到达的时刻 g
p, m, g = map(int, input().strip().split())

num1 = p % (a + b)
num2 = p % (c + d)
num3 = m % (a + b)
num4 = m % (c + d)
num5 = g % (a + b)
num6 = g % (c + d)

"""
如果没有狗处于暴躁状态,输出 none。
如果恰好有一条狗处于暴躁状态,输出 one。
如果两条狗都处于暴躁状态,输出 both。
"""
if 1 <= num1 <= a and 1 <= num2 <= c:
    print('both')
elif (1 <= num1 <= a and num2 > c) or (1 <= num2 <= c and num1 > a):
    print('one')
else:
    print('none')

if 1 <= num3 <= a and 1 <= num4 <= c:
    print('both')
elif (1 <= num3 <= a and num4 > c) or (1 <= num4 <= c and num3 > a):
    print('one')
else:
    print('none')

if 1 <= num5 <= a and 1 <= num6 <= c:
    print('both')
elif (1 <= num5 <= a and num6 > c) or (1 <= num6 <= c and num5 > a):
    print('one')
else:
    print('none')

10. Number(特殊数字还原)

题目描述

生活中我们会碰到一些特殊数字,这些数字使用一些特殊表达方式后会方便记忆和使用。比如说,109+7 就非常常见——它相比于 1000000007,更方便选手看清数字而不必数 0,而且没有科学计数法的精度损失。

你现在有一个形如 10k+x 的数字,请还原成一般写法。

输入格式

一行两个整数 k,x。(0≤x<1018,0≤k≤500。)

输出格式

一行一个整数表示 10k+x。

样例输入

9 7

样例输出

1000000007
k, x = map(str, input().strip().split())
# print(k)
# print(x)
# 转成字符串
n = f'1{"0" * int(k) }'
# print(n)
len_max = max(len(n), len(x))
# print(len_max)
# 统一位数
n = n.rjust(len_max, '0')
m = x.rjust(len_max, '0')
# print(n)
# print(m)
num = "0"
left = 0
# 从最低位开始逐位进行相加
for i in range(len_max-1, -1, -1):
    left = int(n[i]) + int(m[i]) + int(num[-1])
    num = num[:-1] + '{:02d}'.format(left)[::-1]
# 倒序输出
print(num.rstrip('0')[::-1])

11. BIJELE(凑齐棋盘)

题目描述

对于一套正确的棋子,应该包含:

  • 一个国王;
  • 一个皇后;
  • 两个车;
  • 两个象;
  • 两个马;
  • 八个兵。

现在给出这套残缺的棋子中每种棋子分别有多少个,请你求出需要如何添加或删除棋子来凑出完整的棋盘。

输入格式

输入一行六个数,依次表示国王,皇后,车,象,马,兵的数量。这些数字都在 0 ~ 10 之间(包含端点)。

输出格式

输出一行六个数,依次表示国王,皇后,车,象,马,兵需要添加或删除的数量。用正数来表示添加,用负数来表示删除。

样例输入#1

0 1 2 2 2 7

样例输出#1

1 0 0 0 0 1

样例输入#2

2 1 2 1 2 1

样例输出#2

-1 0 0 1 0 7
chess = [1, 1, 2, 2, 2, 8]
nums = [int(i) for i in input().strip().split()]
result = [chess[i]-nums[i] for i in range(6)]
# print(result)
print(' '.join(map(str, result)))

12. OKUPLJANJE(刊登人数与实际人数之差)

题目描述

一场巨大的派对结束以后,有五家报纸刊登了参加这场派对的人数,然而这些报纸上的数字可能是错误的。

现在你知道整个会场的面积是 L 平方米,并且平均每平方米上有 p 个人。现在请分别求出这五家报纸刊登的参加人数与实际参加人数之差。

输入格式

输入的第一行有两个整数,分别表示会场面积 L 和平均每平方米的人数 p(1≤ L,p ≤109)。

第二行有五个整数 a1 … a5,分别表示五家报纸刊登的人数(1≤*ai*≤1018)。

输出格式

输出一行五个整数,依次表示每家报纸刊登人数与实际人数之差。

样例输入#1

1 10
10 10 10 10 10

样例输出#1

0 0 0 0 0

样例输入#2

5 20
99 101 1000 0 97

样例输出#2

-1 1 900 -100 -3
L, p = map(int, input().strip().split())
total = L*p
person = [int(i) for i in input().strip().split()]
result = [person[i]-total for i in range(5)]
# print(result)
print(' '.join(map(str, result)))

13. KARTE(缺失花色张数)

题目描述

这里有一堆牌,可惜它们似乎不全。

您需要找出每种花色缺失的张数。

如果有相同的扑克牌,请输出 GRESKA

输入格式

您要读取的是一个字符串 s,每三个字符为一张扑克牌。

对于每一张扑克牌:

  • 第一位为花色,用 PKHT 表示,且输出也是这个顺序。
  • 接下来两位,为这张牌的点数,个位数会在十位补零。

(1≤∣s∣≤103s 中仅含有数字与 PKHT,每张牌的点数 ∈[1,13] )

输出格式

如果有相同的扑克牌,请输出 GRESKA

否则按 PKHT 的顺序,输出该花色缺的牌数。

样例输入#1

P01K02H03H04

样例输出#1

12 12 11 13

样例输入#2

H02H10P11H02

样例输出#2

GRESKA

样例输入#3

P10K10H10T01

样例输出#3

12 12 12 12
colors = {'P': 0, 'K': 0, 'H': 0, 'T': 0}
cards = input().strip()
list_card = [cards[i:i+3] for i in range(0, len(cards), 3)]
# print(list_card)
same = False
for card in list_card:
    if list_card.count(card) > 1:
        same = True
        break
if same:
    print('GRESKA')
else:
    for k in colors.keys():
        colors[k] = cards.count(k)
    result = [13-i for i in list(colors.values())]
    # print(result)
    print(' '.join(map(str, result)))

14. ZAMKA

题目描述

给定三个整数 L,D,X(1≤LD≤104,1≤X≤36),你需要找到两个整数 N,M,使得:

  • N 为满足条件的最小整数,LND 且 N 的各位数字之和为 X;
  • M 为满足条件的最大整数,LMD 且 M 的各位数字之和为 X。

保证 N,M 一定存在。

输入格式

输入共三行。

第一行一个整数 L,第二行一个整数 D,第三行一个整数 X。

输出格式

输出共两行。

第一行为一个整数 N,第二行为一个整数 M。

样例输入#1

1
100
4

样例输出#1

4
40

样例输入#2

100
500
12

样例输出#2

129
480

样例输入#3

1
10000
1

样例输出#3

1
10000
def cal_sum(num):
    num = str(num)
    sum = 0
    for i in num:
        sum += int(i)
    return sum


L = int(input().strip())
D = int(input().strip())
X = int(input().strip())

if 1 <= L <= D <= 10000 and 1 <= X <= 36:
    if cal_sum(L) == X and cal_sum(L) == cal_sum(D):
        if L <= D:
            print(L)
            print(D)
    else:
        mark_N = D
        mark_M = L
        for N in range(L, D + 1):
            if cal_sum(N) == X:
                mark_N = N if N < mark_N else mark_N
                mark_M = N if N > mark_M else mark_M
        print(mark_N)
        print(mark_M)

15. Imena(统计名字个数)

题目描述

单词是由大写或小写字母组成的字符串。特别的,末尾也可以是标点符号(.,?,!)。名字是 有且仅有首字母为大写字母 的单词。

句子是由一些单词组成的字符串,并且最后一个字符是标点符号(.,?,!

给定 N 个句子,Mirko 想让你统计每个句子中分别有多少个名字。

输入格式

第一行包含一个正整数 N(1≤N≤5),表示句子的个数。

第二行包含这 N 个句子。这些句子的字符总数不会超过 103

输出格式

包含 N 行,每行一个正整数。第 i 行表示第 i 个句子的名字总数。

样例输入#1

1
Spavas li Mirno del Potro Juan martine?

样例输出#1

4

样例输入#2

2
An4 voli Milovana. Ana nabra par Banana.

样例输出#2

1
2
def cal_name(line):
    """统计名字出现的个数,可重复出现"""
    words = line.split(' ')
    count = 0
    for word in words:
        # isalpha()函数:检测字符串是否只由字母组成
        # istitle()函数:检测字符串首字母是否大写
        if word.isalpha() and word.istitle():
            count += 1
    return count


n = int(input().strip())
lines = input().strip()
if 1 <= n <= 5:
    chars = ['.', '?', '!']
    for i in chars:
        lines = lines.replace(i, '-')
    lines = [line for line in lines.split('-') if line]
    for line in lines:
        print(cal_name(line))

你可能感兴趣的:(学习笔记,洛谷,编程基础,python)