洛谷基础题练习12

1. 语句解析

题目描述

一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:=[变量或一位整数];。未赋值的变量值为 0 输出 a,b,c 的值。

输入格式

一串符合语法的 PASCAL 语言,只有 a,b,c 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,未赋值的变量值为 0。

输出格式

输出 a,b,c 最终的值。

样例输入

a:=3;b:=4;c:=5;

样例输出

3 4 5
dict_nums = {'a': 0, 'b': 0, 'c': 0}
list1 = [s for s in input().strip().split(';') if s]
# print(list1)
for s in list1:
    var, value = s.split(':=')
    if value in dict_nums.keys():
        dict_nums[var] = dict_nums[value]
    else:
        dict_nums[var] = value
print(' '.join(map(str, list(dict_nums.values()))))

2. 禽兽的传染病

题目描述

禽兽患传染病了。一个禽兽会每轮传染 x 个禽兽。试问 n 轮传染后有多少禽兽被传染?

提示:保证 x,n 以及答案都在 64 位无符号整数的表示范围内。)

输入格式

两个非负整数 x 和 n。

输出格式

一个整数,即被传染的禽兽数。

样例输入

10 2

样例输出

121
def f(x, n):
    """
    第一轮:初始:1 传染1:x ==> x+1(新被传染的加上上一轮的)
    第二轮:初始:x+1 传染1:x ==> (x+1) * x + (x + 1)
    第三轮:初始:(x+1) * x + (x + 1) ==> ((x+1) * x + (x + 1)) * x + ((x+1) * x + (x + 1))
    ...
    """
    if n == 1:
        return x + 1
    else:
        return f(x, n - 1) * (x + 1)


x, n = map(int, input().strip().split())
print(f(x, n))

3. 三子棋Ⅰ

题目描述

小a和uim喜欢互相切磋三子棋。三子棋大家都玩过是吗?

由于小a比较愚蠢,uim总是让他先。

我们用9个数字表示棋盘位置:

123
456
789
所有的棋谱都是已经结束的棋局,要么一方获胜,要么平局。

今天,他们下了一下午的棋,小a为了提高技术,录下了很多棋谱。他想知道,一盘棋结束时,到底是谁赢。

输入格式

一行,一串数字,表示落子的地点。小a总是先下

输出格式

一行,如果小a赢,输出“xiaoa wins.”。如果uim赢,输出“uim wins.”。如果平局,输出“drew.”

样例输入 #1

5237649

样例输出 #1

xiaoa wins.

样例输入 #2

539128647

样例输出 #2

drew.
def check(list1):
    """
    能赢的几种情况:
    [1, 2, 3],
    [1, 4, 7],
    [1, 5, 9],
    [2, 5, 8],
    [3, 6, 9],
    [3, 5, 7],
    [4, 5, 6],
    [7, 8, 9]
    """
    flag = False
    if 1 in list1:
        if (2 in list1 and 3 in list1) or (4 in list1 and 7 in list1) or (5 in list1 and 9 in list1):
            flag = True
    if 2 in list1:
        if 5 in list1 and 8 in list1:
            flag = True
    if 3 in list1:
        if (6 in list1 and 9 in list1) or (5 in list1 and 7 in list1):
            flag = True
    if 4 in list1:
        if 5 in list1 and 6 in list1:
            flag = True
    if 7 in list1:
        if 8 in list1 and 9 in list1:
            flag = True
    return flag


a = []
u = []
str1 = input().strip()
for i in range(len(str1)):
    if i % 2 == 0:
        a.append(int(str1[i]))
    else:
        u.append(int(str1[i]))
# print(sorted(a))
# print(sorted(u))
if check(sorted(a)):
    print('xiaoa wins.')
elif check(sorted(u)):
    print('uim wins.')
else:
    print('drew.')

4. 手机

题目描述

一般的手机的键盘是这样的:

要按出英文字母就必须要按数字键多下。例如要按出 x 就得按 9 两下,第一下会出 w,而第二下会把 w 变成 x。0 键按一下会出一个空格。

你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。

输入格式

一行句子,只包含英文小写字母和空格,且不超过 200 个字符。

输出格式

一行一个整数,表示按键盘的总次数。

样例输入

i have a dream

样例输出

23
dict_key = {
    '1': ['a', 'd', 'g', 'j', 'm', 'p', 't', 'w', ' '],
    '2': ['b', 'e', 'h', 'k', 'n', 'q', 'u', 'x'],
    '3': ['c', 'f', 'i', 'l', 'o', 'r', 'v', 'y'],
    '4': ['s', 'z']
}

str1 = input()
count = 0
for i in str1:
    if i in dict_key['1']:
        count += 1
    if i in dict_key['2']:
        count += 2
    if i in dict_key['3']:
        count += 3
    if i in dict_key['4']:
        count += 4
print(count)

5. 表达式括号匹配

题目描述

假设一个表达式有英文字母(小写)、运算符(+-*/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255,左圆括号少于 20 个。

输入格式

一行:表达式。

输出格式

一行:YESNO

样例输入 #1

2*(x+y)/(1-x)@

样例输出 #1

YES

样例输入 #2

(25+x)*(a*(a+b+b)@

样例输出 #2

NO
def remove_brackets(s):
    while s.count('()') != 0:
        # 将'()'全部替换从空字符
        s = s.replace('()', '')
    return s


str1 = input().strip()
str1 = str1[:str1.find('@')]
# print(str1)
if len(str1) < 255 and str1.count('(') < 20:
    for i in str1:
        # 只保留'('和')'
        if i not in ['(', ')']:
            str1 = str1.replace(i, '')
    # print(str1)

    # 判断左圆括号和右圆括号出现的次数是否相等
    if str1.count('(') == str1.count(')'):
        new_str = remove_brackets(str1)
        # print(new_str)
        if len(new_str) == 0:
            print('YES')
        else:
            print('NO')
    else:
        print('NO')

6. Davor

题目描述

在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。他将在 2018 年 12 月 31 日开始出发,在这之前需要一共筹集 n 元钱。他打算在每个星期一筹集 x 元,星期二筹集 x+k 元,……,星期日筹集 x+6k 元,并连续筹集 52 个星期。其中 x,k 为正整数,并且满足 0 < X ≤ 100。

现在请你帮忙计算 x,k 为多少时,能刚好筹集 n 元。

如果有多个答案,输出 x 尽可能大,k 尽可能小的。注意 k 必须大于 0。

输入格式

输入一个整数 N (1456 ≤ N ≤ 145600), 表示需要筹集的资金.

输出格式

第一行输出 x的值 , 第二行输出k的值.

样例输入 #1

1456

样例输出 #1

1
1

样例输入 #2

6188

样例输出 #2

14
1

样例输入 #3

40404

样例输出 #3

99
4
# (7*x + 21*k)*52 = n
n = int(input().strip())
if 1456 <= n <= 145600:
    num = n // (52 * 7)
    # print(num)
    dict_num = {}
    for x in range(100, 0, -1):
        if x < num and (num - x) % 3 == 0:
            k = (num - x) // 3
            dict_num[str(x)] = k
    # print(dict_num)
    list_num = sorted(dict_num.items(), key=lambda m: m[1])
    # print(list_num)
    print(list_num[0][0])
    print(list_num[0][1])

7. Even? Odd? (判断奇偶数)

题目描述

Bessie那惨无人道的二年级老师搞了一个有 N 个正整数 I 的表叫Bessie去判断“奇偶性”(这个词语意思向二年级的学生解释,就是“这个数是单数,还是双数啊?”)。

写一个程序读入N个整数,如果是双数,那么在单独的一行内输出"even",如果是单数则类似地输出"odd".

输入格式

第一行位一个整数N(1 <= N <= 100)

随后N行,一行一个正整数I (1 <= I <= 1060) ,判断其奇偶性

输出格式

奇数输出"odd",偶数输出"even"

样例输入 #1

2 
1024 
5931

样例输出 #1

even 
odd
n = int(input().strip())
for i in range(n):
    num = input().strip()
    if num[-1] in ['0', '2', '4', '6', '8']:
        print('even')
    else:
        print('odd')

8. 彩票摇奖

题目描述

为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:

  1. 每张彩票上印有 7 个各不相同的号码,且这些号码的取值范围为 1~33。
  2. 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
  3. 共设置 7 个奖项,特等奖和一等奖至六等奖。

兑奖规则如下:

  • 特等奖:要求彩票上 7 个号码都出现在中奖号码中。
  • 一等奖:要求彩票上有 6 个号码出现在中奖号码中。
  • 二等奖:要求彩票上有 5 个号码出现在中奖号码中。
  • 三等奖:要求彩票上有 4 个号码出现在中奖号码中。
  • 四等奖:要求彩票上有 3 个号码出现在中奖号码中。
  • 五等奖:要求彩票上有 2 个号码出现在中奖号码中。
  • 六等奖:要求彩票上有 1 个号码出现在中奖号码中。

注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。例如,中奖号码为:
23   31   1   14   19   17   18 23\ 31\ 1\ 14\ 19\ 17\ 18 23 31 1 14 19 17 18
,则彩票
12   8   9   23   1   16   7 12\ 8\ 9\ 23\ 1\ 16\ 7 12 8 9 23 1 16 7
由于其中有两个号码(23 和 1)出现在中奖号码中,所以该彩票中了五等奖。

现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。

输入格式

输入的第一行只有一个自然数 n(1 ≤ n < 1000),表示小明买的彩票张数;

第二行存放了 7 个介于 1 和 33 之间的自然数,表示中奖号码;

在随后的 n 行中每行都有 7 个介于 1 和 33 之间的自然数,分别表示小明所买的 n 张彩票。

输出格式

依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。

样例输入

2
23 31 1 14 19 17 18
12 8 9 23 1 16 7
11 7 10 21 2 9 31

样例输出

0 0 0 0 0 1 1
def cal_number(list1, list2):
    """计算两个列表的交集"""
    count = 0
    for i in list1:
        if i in list2:
            count += 1
    return count


if __name__ == '__main__':
    dict_result = {str(i): 0 for i in range(7)}
    n = int(input().strip())
    if 1 <= n < 1000:
        # 中奖号码
        list_numbers = [int(i) for i in input().strip().split()]
        list2 = []
        for i in range(n):
            numbers = [int(j) for j in input().strip().split()]
            list2.append(numbers)
        for i in range(len(list2)):
            # 计算交集长度
            same_num = cal_number(list2[i], list_numbers)
            # print(same_num)
            # 对应的中奖张数进行累加
            # 交集长度:1->六等奖 2->五等奖,以此类推
            if same_num >= 1:
                dict_result[str(7 - same_num)] += 1
        print(' '.join(map(str, list(dict_result.values()))))

9. FILIP

题目描述

给你两个十进制正整数 a, b(100 ≤a,b≤ 999,a,b 不含 0 或不为 0),输出将这两个数翻转后的较大数。

输入格式

第一行,两个十进制正整数 a, b。

输出格式

第一行,a 和 b 翻转后的较大数。

样例输入 #1

734 893

样例输出 #1

437

样例输入 #2

221 231

样例输出 #2

132

样例输入 #3

839 237

样例输出 #3

938
a, b = map(str, input().strip().split())
new_a = int(a[::-1])
new_b = int(b[::-1])
print(max(new_a, new_b))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦里逆天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值