• 题解
  • 1、非降序数组
  • 分析
  • 2、吃!吃!吃!
  • 分析
  • 参考代码
  • 3、计算逆波兰表达式的结果
  • 分析
  • 参考代码
  • 4、会议安排
  • 分析


比赛页:

题解

1、非降序数组

python算法竞赛 python竞赛题_python算法竞赛

写一个函数,传入两个非降序的整数数组(A, B),将 A, B 合并成一个非降序数组 C,返回 C(不要使用内置 sort 函数)。

输入描述

第一行输入两个整数n,m。(1<=n,m<=100000)分别表示数组A,B的大小。
第二行给出n个整数a。(1<=a<=10000)
第三行给出m个整数b。(1<=b<=10000)

输出描述

输出合并之后排序好的数组。

输入样例

3 3
1 9 10
3 12 41

输出样例

1 3 9 10 12 41

分析

这道题目非常简单,只需将两个数组相加即可。但题目不允许使用内置 sort 函数,而题目数据量又比较大(1<=n,m<=100000),需要采用速度比较快的排序算法。

2、吃!吃!吃!

python算法竞赛 python竞赛题_开发语言_02


已知n个整数。

每3个数算一个周期。

不足一个周期补0.

在周期的第一个位置的数的权值和等于a1+a[1+3]+……

第二个位置的数的权值和等于a2+a[2+3]+… …

求三个数的最大权值。

如果最大权值为第一个数,输出’J’;

最大权值为第二个数,输出’H’;

最大权值为第三个数,输出’B’。

输入描述

第一行输入一个整数n。(1<=n<=100)
第二行输入n个整数。

输出描述

输出答案。

输入样例

4
1 1 1 1

输出样例

J

分析

这题没有看出和吃!吃!吃!有什么关系,只需每隔3个数相加即可,也不用考虑什么周期补零,后面没有满足3个间隔的数自然也不用加了。

参考代码

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n, arr):
        result = None

        # TODO: 请在此编写代码
        n1,n2,n3=0,0,0
        for i in range(0,n,3):
            n1+=arr[i]
        for i in range(1,n,3):
            n2+=arr[i]
        for i in range(2,n,3):
            n3+=arr[i]
        t=max(n1,n2,n3)
        if t==n1:
            result='J'
        elif t==n2:
            result='H'
        else:
            result='B'

        return result


if __name__ == "__main__":

    
    n = int(input().strip())
    
    
    arr = [int(item) for item in input().strip().split()]
    
    
    sol = Solution()
    result = sol.solution(n, arr)
    
    print(result)

3、计算逆波兰表达式的结果

python算法竞赛 python竞赛题_python_03


逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4) *5”不相同, 但后缀记法中前者写做“3 4 5 * -”, 无歧义地表示“3 (4 5 *) -”; 后者写做“3 4 - 5 *”。

输入描述

第一行输入一个整数 n,表示包含元素数量.(1<=n<=1000)
第二行输入n个元素。

输出描述

输出计算后的结果。

示例1
输入
2
1 + 3 *

2 1 + 3 *

输出

9

示例2
输入

123 23 12 + -

输出
-88

88

分析

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。

注:该题存在bug原先的题目中提到“第一行输入一个整数 n,表示包含元素数量.(1<=n<=1000)”,示例1中输入第一行为“2”,第二行却是“1 + 3 *”。显然按照题目描述,如果表达式为1 + 3 *,缺少了一个操作数,该表达式无法计算,无法得出输出中的9。显然元素数量也不可能为2,因为无法构成表达式。推测正确的输入应为2 1 + 3 *,无需在第一行输入整数n,可得结果((2 + 1) * 3) = 9。题目的模板代码中却写了输入n的代码,提交代码后的测试用例并不需要n。 示例2中,输入为“123 23 12 + -”,而输出为“-88”,根据逆波兰表达式的定义,123 23 12 + -的中缀表达式应为123 - (23 + 12)=88,只有理解为(12+23)-123才会得到-88的结果而题目的测试用例依然存在此类问题,需要将错就错才能通过本题。 正确的题目可参照力扣150. 逆波兰表达式求值

参考代码

注:由于栈是LIFO(后进先出),所以减法和除法要注意操作符顺序,加法和乘法操作数颠倒不影响结果,但该题需将错就错才能通过。

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, arr):
        result = None

        # TODO: 请在此编写代码
        temp=[]
        for t in arr:
            if t=="+":
                a,b=temp.pop(),temp.pop()
                c=int(b)+int(a)
                temp.append(c)
            elif t=="-":
                a,b=temp.pop(),temp.pop()
                c=int(b)-int(a)    #由于栈是LIFO,此处不能写c=int(a)-int(b)
                temp.append(c)
            elif t=="*":
                a,b=temp.pop(),temp.pop()
                c=int(b)*int(a)
                temp.append(c)
            elif t=="/":
                a,b=temp.pop(),temp.pop()
                c=int(b)//int(a)    #由于栈是LIFO,此处不能写c=int(a)//int(b)
                temp.append(c)
            else:
                temp.append(t)
        result=temp[-1]

        return result


if __name__ == "__main__":
    #n = int(input().strip())
    arr = input().split()
    
    
    sol = Solution()
    result = sol.solution(arr) 
    print(result)

4、会议安排

python算法竞赛 python竞赛题_python_04


开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的!(老大可能坐在桌子上边)

小艺被分配到排桌椅的活,可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。

她决定用现有的布局当作是会议座位安排。

每个桌子分配一个人。相邻桌子不同的桌子颜色不同。

小艺想知道选择某个桌子之后老大身边能围多少人?

输入描述

第一行输入2个整数n,m,一个字符c。(1<=n,m<=100)分别表示空间大小和老大指定的桌椅颜色号。
以下n行每行m个字符。’.’代表空地,其他字符表示桌椅。连接在一个且相同的字符表示一个桌子。

输出描述

输出围着老大的人数。

输入样例

3 4 R
G.B.
BRRA
TTT.

输出样例

4

分析

从老大指定的桌椅向上下左右搜索,进行判断是否符合题目条件,即可。