统计子矩阵&&考勤刷卡

题目

给定一个 N×M 的矩阵 A, 请你统计有多少个子矩阵 (最小 1×11×1, 最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 K ? 

思路

暴力的去遍历每一个子矩阵,计算其和是否满足题目要求。但是发现二维数组,我没有办法去得到它的子矩阵(除非暴力去得到每个值),因为是不允许使用numpy这个库。 就去看了题解,发现主要是用了一个前缀和以及双指针,来解决这个题目。

好吧 还是没有很懂怎么用双指针(为啥子矩阵的个数==p,q之间的行数啊),暴力去遍历每一个子矩阵(通过30%的用例)

可以参考这个博客

4405. 统计子矩阵_向上的yyy的博客-CSDN博客

代码 

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')

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值