计挑赛python组初赛2020

1-1 数字与相邻的前、后数字之和可以被4整除
题目
题目描述:给定两个整数N和M(0<N<M<100000),求N到M中满足如下条件的数字,该数字与相邻的前、后数字之和可以被4整除。比如N=3,M=9时,4、8 是满足条件的, 而5、6、7不满足,3和9因为前、后数字不在N到M中,不参与统计。
输入说明:两个正整数N和M(N<M<100000)
输出说明:满足要求的数字,如果有多个满足条件的数字,按出现次序输出前3个,如果不足3个,用-1补充。
输入样例1:11 100
输入样例2:3 9
输出样例1:12 16 20
输出样例2:4 8 -1
数据范围:(0<N<M<100000)


挺简单的

n, m = map(int,input().split())
lis=[]
for i  in range(n+1,m):
    if (3*i)%4==0:
        lis.append(i)
    if len(lis)==3:
        break
while len(lis)<3:
    lis.append(-1)
print(lis[0],lis[1],lis[2])



2-1 连续M个数之积最小
题目
题目描述:输入一个包含N个整数的数组,从中找到连续M个数之积最小的数字组合。
输入说明:第一行是两个正整数N(N<200)和M(M<10);第二行是N个整数(每个数字Ni都是整数,且|Ni|<1000),中间用空格分开。
输出说明:最小的M个连续数字积及第一个数在数组中的位置(初始位置按1进行计算)。
输入样例:10 4
1 2 3 4 5 6 7 8 9 10
输出样例:24 1

n , m = map(int, input().split())
list1=list(map(int,input().split()))
list2=[]
for i in range(0,n-m):
    t=1
    for j in range(i,i+m):
        t*=list1[j]
    list2.append((t,i))
list2.sort()
print(list2[0][0],list2[0][1]+1)


3-1 字符串中最长连续非降序子串  挺难理解的√√√
题目
题目描述:输入一个由’a’-‘z’组成的字符串,找到字符串中出现的最长连续非降序子串,输出该子串。

输入说明:一个字符串S(长度<10000)

输出说明:字符串中最长的连续升序子串

输入样例:abcadiasiqacdfgiikkg

输出样例:acdfgiikk

数据范围:S长度<10000

代码

s = input()
start, end = 0, 0
max_len = 0
substring = ''

for i in range(1, len(s)):
    if s[i] >= s[i - 1]:
        end += 1
    else:
        if end - start + 1 > max_len:
            max_len = end - start + 1
            substring = s[start:end + 1]
        start = i
        end = i

if end - start + 1 > max_len:
    substring = s[start:end + 1]

print(substring)



官方题解:

str1 = input()
L, R, res, resL, resR = 0, 0, 0, 0, 0
while R != len(str1)-1:
    R += 1
    if str1[R] < str1[R-1]:
        if R-L-1 > res:
            res = R - L - 1
            resL = L
            resR = R
        L = R
print(str1[resL:resR])


gpt辅助理解:
这是一种使用两个指针(L和R)在字符串上滑动以找到最长连续非降序子串的方法。

1. 首先,我们定义两个指针L和R,均初始化为0,表示正在考虑的子串的开头和结尾。我们还定义了一个结果变量`res`,它将存储找到的最长子串的长度,以及`resL`和`resR`,它们将存储最长子串的起点和终点。

2. 然后,我们开始循环,到字符串结束为止:
   - 我们先将R指针向右移动一格(即`R += 1`),拓展当前正在考虑的子串。
   - 如果新考虑的字符(即`str1[R]`)比前一个字符小(即`str1[R] < str1[R-1]`),那么当前子串就不再是非降序的,我们需要开始寻找新的子串。
   - 在开始新的子串之前,我们检查当前子串的长度`R - L - 1`是否比之前找到的最长子串`res`还要长。如果是的话,我们用当前子串的长度更新`res`,并且用L和R更新`resL`和`resR`。
   - 然后,我们用R更新L,表示开始新的子串。

3. 最后,我们打印出最长的非降序子串,即`str1[resL:resR]`。

这个代码中,我们一直在找非降序子串的结束点(即那些比前一个字符小的字符),然后在找到新的结束点时更新最长子串。这种方法的好处是,我们总是能找到最长的子串,因为我们在每次找到子串结束时都进行了检查和更新。而且,由于我们是从左到右扫描字符串的,所以我们总是能找到最左边的最长连续非降序子串。



3-2 病毒信息筛选
题目
题目描述:
计算网络数据包中的可能被注入病毒片段信息,经过长期观察发现,计算机病毒文件源码中往往包含“_1234.exe”的字符片段。现在请你开发一个计算程序,辅助信息专家检测这个病毒嫌疑特征。

输入说明:一个字符串S

输出说明:字符串中包含”_1234.exe”字符片段的位置,如果包含多个病毒嫌疑特征片段,输出数量后,再输出每个片段的位置。如果没有检测到病毒嫌疑片段,就输出0

输入样例:ox123_0212_3323_1234.exe20202020202_1234.exe

输出样例:2 15 35


代码

s=input()
count=0
l=[]
for i in range(len(s)):
	if s[i:i+9]=="_1234.exe":
		count+=1
		l.append(i)
print(count,end=' ')
for j in l:
    print(j,end=' ')


官方题解(看起来较复杂):
S = input()
result = []
count = 0
if "_1234.exe" not in S:
    print(0)
else:
    listStr = list(S)
    for i in range(0, len(listStr)):
        if i + 9 <= len(listStr):
            tempStr = listStr[i:i+9]
            if tempStr == list("_1234.exe"):
                result.append(i)
                count += 1
    if count != 1:
        print(count,end=' ')
    for i in result:
        print(i,end=' ')



3-3 货物摆放
题目
题目描述:
便利店拟上架一批货物,为了便于顾客找到物品,店长尝试按照货物的颜色对这批商品进行摆放,已知这批货物的名称和颜色,请你按照颜色的字母顺序对这批货物进行处理,给出货物摆放的次序。

输入说明:第一行是一个整数N,表明这批货物的数量;接下来N行是货物名称S和颜色信息T,S和T都是字符串,中间用空格分开。

输出说明:输出按颜色字母序排序摆放的货品次序。如果有2个物品的颜色相同,按照货品名称字母排序。

输入样例:
6
FastNoodle    Red
Cake         Orange
RiceRoll       Black
Sandwich     Yellow
Cheese       Blue
Milk         White

输出样例:
RiceRoll Cheese Cake FastNoodle Milk Sandwich

代码用内置函数排序:
N = int(input())
products = []
for _ in range(N):
    product, color = input().strip().split()
    products.append((color, product))
products = sorted(products)
for color, product in products:
    print(product, end=' ')


官方代码:
Num = eval(input())
listGoods = []
for i in range(Num):
    tmp = input()
    listGoods.append((tmp.split()[0], tmp.split()[1]))
listGoods.sort(key=lambda x:x[1])
for i in listGoods:
    print(i[0], end='  ')


4-1 游戏地图选洼地  建立二维数组非numpy  √
题目
题目描述:
游戏中的地图都是用二维数组表达的,每个位置表示一个整数表示高度,现在需要找出地图中的洼地放置宝物。已知表示地图中各点的高度,用二维数组存放,请找出其中最低的洼地。二维地图中洼地的定义是该点上、下、左、右四个方向的高度值都大于该点的高度值(边界上的点不满足洼地的定义)。

输入说明:第一行是整数N(0<N<1001),表示二维数组的行数和列数。接下来是一个N行、N列的二维整数矩阵,每个数字表示地图上该点处的地面高度Hij(0<Hij<2020)。

输出说明:用于藏宝的最低洼地的位置坐标i、j(1<=i,j<=N),其中i表示行,j表示列。如果不存在满足条件的山峰,输出-1 -1。测试数据不存在多个同样高度的最低洼地。

输入样例:
6
0 3 0 0 1 1
0 6 0 1 1 1
9 9 9 7 5 3
6 5 3 5 3 3
5 6 6 6 7 6
3 4 4 5 5 5
输出样例:4 3

代码

n=int(input())
b,c = -1, -1
list = []
for _ in range(n):
    row = [int(x) for x in input().split()] # 建立二维数组非numpy
    list.append(row)
if n<3:
    print(b,c)
    # exit()
else:
    for i in range(1,n-1):
        for j in range(1,n-1):
            if list[i-1][j]>list[i][j] and list[i+1][j]>list[i][j] and list[i][j-1]>list[i][j] and list[i][j+1]>list[i][j]:
                b,c=i,j
    print(b+1,c+1)

参考代码:


Map = []
res, resI, resJ = 2021, -1, -1
Col = eval(input())
for i in range(Col):
    Map.append(list(map(int, input().split())))
if Col < 3:
    print("-1 -1")
    exit()
for i in range(1, Col-1):
    for j in range(1, Col-1):
        if Map[i][j] < Map[i-1][j] and Map[i][j] < Map[i+1][j] and Map[i][j] < Map[i][j-1] and Map[i][j] < Map[i][j+1]:
            if Map[i][j] < res:
                res, resI, resJ = Map[i][j], i, j
print(resI+1, resJ+1)

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AAA阿魏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值