题目
给定一个 N×M 的矩阵 A, 请你统计有多少个子矩阵 (最小 1×11×1, 最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 K ?
思路
暴力的去遍历每一个子矩阵,计算其和是否满足题目要求。但是发现二维数组,我没有办法去得到它的子矩阵(除非暴力去得到每个值),因为是不允许使用numpy这个库。 就去看了题解,发现主要是用了一个前缀和以及双指针,来解决这个题目。
好吧 还是没有很懂怎么用双指针(为啥子矩阵的个数==p,q之间的行数啊),暴力去遍历每一个子矩阵(通过30%的用例)
可以参考这个博客
代码
import os
import sys
# 请在此输入您的代码
N, M, K = map(int, input().split())
A = [[0 for i in range(M+1)]]
for i in range(1, N+1):
A.append([0] + list(map(int, input().split())))
for j in range(1,M+1):
A[i][j] =A[i][j] + A[i-1][j] + A[i][j-1] - A[i-1][j-1] # 记录每个数组 左上角的元素和
count = 0
for i in range(1, N+1):
for j in range(1, M+1):
for x in range(i, N+1):
for y in range(j, M+1):
if A[x][y] - A[i-1][y] - A[x][j-1] + A[i-1][j-1] <= K: # 左上角为(i,j),右下角为(x,y)的矩阵的和
count += 1
print(count)
Tips
S[i, j] = 第i行j列格子左上部分所有元素的和 :a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1];
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]
题目
小蓝负责一个公司的考勤系统, 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗。
当员工刷卡时, 会在后台留下一条记录, 包括刷卡的时间和员工编号, 只 要在一天中员工刷过一次卡, 就认为他到岗了。
现在小蓝导出了一天中所有员工的刷卡记录, 请将所有到岗员工的员工编 号列出。
思路
直接将输入的员工编号进行排序后输出。这里去掉重复的编号,我用的是str的in函数。应该还可以直接用set()。
list1=list(set(list1))
代码
import os
import sys
# 请在此输入您的代码
n = int(input())
num = []
for i in range(n):
_, temp = map(str, input().split())
if temp not in num:
num.append(temp)
num.sort(key = lambda x: int(x)) # 将str转化为按其对应的int值进行排序
print(*num,sep='\n' )
Tips
之前将数组中的内容换行输出,我都是用循环。可以使用print中的sep。
print(*list, sep = '\n')