CCF CSP认证 历年题目自练Day27

2023-10-11 01:12

本文主要是介绍CCF CSP认证 历年题目自练Day27,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目一

试题编号: 202104-1
试题名称: 灰度直方图
时间限制: 1.0s
内存限制: 512.0MB
请添加图片描述
样例输入
7 11 8
0 7 0 0 0 7 0 0 7 7 0
7 0 7 0 7 0 7 0 7 0 7
7 0 0 0 7 0 0 0 7 0 7
7 0 0 0 0 7 0 0 7 7 0
7 0 0 0 0 0 7 0 7 0 0
7 0 7 0 7 0 7 0 7 0 0
0 7 0 0 0 7 0 0 7 0 0
Data
样例输出
48 0 0 0 0 0 0 29
Data
评测要求:
请添加图片描述

题目分析(个人理解)

  1. 还是先看输入,第一行输入n表示类矩阵的行数,m表示列数,第三个参数l表示每个元素都小于l。
  2. 很简单,直接用列表推导式生成二维列表,依次写入元素值即可,然后再将二维列表一维化,要求输出的是0到(l-1)的元素值出现的次数,那就遍历l,统计在一维列表中出现的次数,然后将次数追加写入到新列表,最后输出新列表即可。
  3. 上代码!!!
n, m, l = map(int, input().split())
num = [[i for i in map(int, input().split())] for j in range(n)]
nums = [i for j in num for i in j]
#nums = sum(num, [])
#上面两种方法都是将二维数组num化为一维数组nums,选一种即可
h = []
for i in range(l):h.append(nums.count(i))#统计i在一维数组中出现的次数,并记录到h中
print(*h)

题目二

试题编号: 202104-2
试题名称: 邻域均值
时间限制: 1.0s
内存限制: 512.0MB
请添加图片描述
请添加图片描述
样例输入
4 16 1 6
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
Data
样例输出
7
Data
样例输入
11 8 2 2
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 7 0 0 0 7 0 0 7 7 0
7 0 7 0 7 0 7 0 7 0 7
7 0 0 0 7 0 0 0 7 0 7
7 0 0 0 0 7 0 0 7 7 0
7 0 0 0 0 0 7 0 7 0 0
7 0 7 0 7 0 7 0 7 0 0
0 7 0 0 0 7 0 0 7 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
Data
样例输出
83
请添加图片描述

题目分析(个人理解)

  1. 首先,这个题目就很能吓唬人,大概思路是这样的,第一行输入n表示有一个n行n列的矩阵(图像),之后的n行输入元素。第二个参数l代表矩阵中的元素小于l,第三个参数是r,用来表示范围,再仔细看题,我们需要判断矩阵中每个元素(像素)在r范围内的平均数是否小于等于t(阈值)也就是第四个参数,如果小于等于那就count +1(count作为计数器),最后输出count就知道较暗区域有几个像素了
  2. 那么问题来了,r是变的,可以是1,2,3…那么对应要求和的数目也在变化,如果是最左上角的元素,当r=1时,总共有四个数相加求和之后再求平均值,如果是第一行第二列就要计算6个数的数值,在中间的位置就要计算9个数的值,很不方便判断,我对类矩阵依旧选择二维列表来实现。那么为了统一针对不同位置的元素可以使用相同的算法我选择对原矩阵扩充r行2r列,使其每一个元素都满足在r=1时计算9个元素求和再求平均数的问题
  3. 如图:就以第一个输入例子为例:(填充之后)
    在这里插入图片描述
    那么用列表生成机器迭代生成即可
mat = [[0] * (n + 2 * r) for _ in range(n + 2 * r)]
for i in range(r, n + r):mat[i] = [0] * r + list(map(int, input().split())) + [0] * r
count = 0
  1. 最关键的点到了,现在都满足遍历原矩阵的时候求和求平均值都是最大的情况((2r+1)**2个),那就很好办来了,接下来给大家介绍二维矩阵前缀和,用来解决任意一个子矩阵内的元素和。
  2. 如图:红色区域相当于要求和的所有元素所在的位置。
    请添加图片描述
    我要求红色部分面积如何求?
# sum[x1][y1] 被减掉两次
area_red=sum[x4][y4]-sum[x3][y3]-sum[x2][y2]+sum[x1][y1]

二维前缀和矩阵的生成:

# mat[xc][yc]表示原始矩阵
sum[x_c][y_c]=sum[x_a][y_a]+sum[x_b][y_b]+mat[x_c][y_c]
<==>
sum[x][y]=sum[x-1][y]+sum[x][y-1]+mat[x][y]
  1. 那么这道题如何求红色部分?
for i in range(r, n + r):for j in range(r, n + r):sum_mat[i][j] = mat[i][j] + sum_mat[i][j - 1] + sum_mat[i - 1][j] - sum_mat[i - 1][j - 1]
  1. 之后只需遍历每一个元素判断是否在红色区域如果是那就加起来求平均值在去和t比大小,若是小于等于就count+1,然后输出count就结束啦!!!
  2. 上完整代码!!!
n, l, r, t = map(int, input().split())
mat = [[0] * (n + 2 * r) for _ in range(n + 2 * r)]
for i in range(r, n + r):mat[i] = [0] * r + list(map(int, input().split())) + [0] * r
count = 0
#计算二维前缀和
sum_mat = [[0] * (n + 2 * r) for _ in range(n + 2 * r)]
for i in range(r, n + r):for j in range(r, n + r):sum_mat[i][j] = mat[i][j] + sum_mat[i][j - 1] + sum_mat[i - 1][j] - sum_mat[i - 1][j - 1]for i in range(r, n + r):for j in range(r, n + r):# 判断领域内元素个数# 领域x,y最左,最右坐标min_i = i - r if i - r > r - 1 else rmax_i = i + r if i + r < n + r else n + r - 1min_j = j - r if j - r > r - 1 else rmax_j = j + r if j + r < n + r else n + r - 1# print(min_i, min_j, max_i, max_j)nums = (max_i - min_i + 1) * (max_j - min_j + 1)# print(nums)sum_m = sum_mat[max_i][max_j] - sum_mat[i - r - 1][max_j] - sum_mat[max_i][j - r - 1] + \sum_mat[i - r - 1][j - r - 1]flag = sum_m / numsif flag <= t:count = count + 1
print(count)

总结

脑子要裂开,出去跑步冷静一下。
请添加图片描述
请添加图片描述

这篇关于CCF CSP认证 历年题目自练Day27的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184457

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

【Shiro】Shiro 的学习教程(二)之认证、授权源码分析

目录 1、背景2、相关类图3、解析3.1、加载、解析阶段3.2、认证阶段3.3、授权阶段 1、背景 继上节代码,通过 debug 进行 shiro 源码分析。 2、相关类图 debug 之前,先了解下一些类的结构图: ①:SecurityManager:安全管理器 DefaultSecurityManager: RememberMeManager:实现【记住我】功能

CCF推荐C类会议和期刊总结(计算机网络领域)

CCF推荐C类会议和期刊总结(计算机网络领域) 在计算机网络领域,中国计算机学会(CCF)推荐的C类会议和期刊为研究者提供了广泛的学术交流平台。以下是对所有C类会议和期刊的总结,包括全称、出版社、dblp文献网址以及所属领域。 目录 CCF推荐C类会议和期刊总结(计算机网络领域) C类期刊 1. Ad Hoc Networks 2. CC 3. TNSM 4. IET Com