当前位置: 首页 > article >正文

蓝桥杯备赛-基础训练(一)数组 day13

区间和

题目描述

给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。

输入描述

第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间,直至文件结束。

输出描述

输出每个指定区间内元素的总和。

输入示例

5
1
2
3
4
5
0 1
1 3

输出示例

3
9

数据范围:

0 < n <= 100000

思路:

和卡哥是一样的,

我一开始真的是以为直接用暴力解法就可以解决(给一个区间,然后把这个区间的和都累加一遍不就得了)

但是后来发现,根本不是这样的,这样的撰写是会超时的

我们可以使用前缀和的方式来撰写代码:

如果,我们想统计,在vec数组上 下标 2 到下标 5 之间的累加和,那是不是就用 p[5] - p[1] 就可以了。

为什么呢?

p[1] = vec[0] + vec[1];

p[5] = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5];

p[5] - p[1] = vec[2] + vec[3] + vec[4] + vec[5];

这样只要执行一次循环就可以了,然后我们用一次减就ok啦

代码:

# 区间和
# 读取数组长度
n = int(input("请输入你要输入几个数字:"))
arr = []
# 读取数组元素
for i in range(0,n):
    num = int(input( ))
    arr.append(num)

arr_sum = [0]*n
k = 0

for i in range(n):
    k = k+arr[i]
    arr_sum[i]=k

print(arr_sum)


arr_1 = [0]*2
s_1 = input("输入你想知道的区间,以空格为分隔:")
arr_1 = list(map(int,s_1.split( )))
jiange = arr_sum[arr_1[1]-1]-arr_sum[arr_1[0]-1]
print(jiange)

开发商购买土地

题目描述:

在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。

现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。

然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。

为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。

注意:区块不可再分。

【输入描述】

第一行输入两个正整数,代表 n 和 m。

接下来的 n 行,每行输出 m 个正整数。

输出描述

请输出一个整数,代表两个子区域内土地总价值之间的最小差距。

【输入示例】

3 3 1 2 3 2 1 3 1 2 3

【输出示例】

0

【提示信息】

如果将区域按照如下方式划分:

1 2 | 3 2 1 | 3 1 2 | 3

两个子区域内土地总价值之间的最小差距可以达到 0。

【数据范围】:

  • 1 <= n, m <= 100;
  • n 和 m 不同时为 1。

思路:

看到本题,大家如果想暴力求解,应该是 n^3 的时间复杂度,

一个 for 枚举分割线, 嵌套 两个for 去累加区间里的和。

但是这个的循环要很多很多,而且其实我感觉不容易写出来

但是如果结合我们的区间和这里的前缀来看,其实是很容易的,而且循环的次数就不会那么多了

代码:

# 开发商购买土地
def find_mini(a:int,b:int)->int:
    if a>b:
        return b
    else:
        return a

hang_lie = [0]*2
s = input("请输入你要几行几列,以空格为分隔:")
hang_lie = list(map(int,s.split()))
num=[]#初始化列表
for i in range(hang_lie[0]):
    row = list(map(int,input().split()))
    num.append(row)
print(num)
hang = hang_lie[0]
lie = hang_lie[1]
hang_list = [0]*hang
lie_list = [0]*lie
# 以行为标准循环后得到每一行的值
i = 0
j = 0
for i in range(hang):
    sum = 0
    for j in range(lie):
        sum = sum+num[i][j]
    hang_list[i] = sum
# 以列表为标准循环后得到每一列的值
i = 0
j = 0
for j in range(lie):
    sum = 0
    for i in range(hang):
        sum = sum+num[i][j]
    lie_list[j] = sum

print(hang_list)
print(lie_list)


min = 1000
for i in range(hang):
    for j in range(i+1,hang):
        min = find_mini(min,hang_list[j]-hang_list[i])
for i in range(lie):
    for j in range(i+1,lie):
        min = find_mini(min,lie_list[j]-lie_list[i])
print(min)


http://www.kler.cn/a/556605.html

相关文章:

  • [文末数据集]ML.NET库学习010:URL是否具有恶意性分类
  • 如何利用AI制作PPT,轻松实现高效演示
  • 计算机毕业设计Python+DeepSeek-R1高考推荐系统 高考分数线预测 大数据毕设(源码+LW文档+PPT+讲解)
  • 23种设计模式 - 状态模式
  • 高级运维:1. 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。2. 基于 openEuler 构建 LVS-DR 群集。
  • 【Python爬虫(27)】探索数据可视化的魔法世界
  • tp6上传文件大小超过了最大值+验证文件上传大小和格式函数
  • 【Flink实战】Flink网络内存和托管内存
  • Powershell Install deepseek
  • 初识机器学习:从零到一的奇妙旅程
  • 16、《SpringBoot+MyBatis集成(4) - 性能优化 - 事务与缓存机制剖析》
  • crAPI靶场学习记录
  • 基于深度学习模型`U-Net`和`segment_anything`(SAM)库的实现示例
  • CSDN违禁词与规避(CSDN社区专属)
  • 详解TCP协议多种机制
  • [数据结构]单链表详解
  • oracle怎么创建定时任务
  • CMake管理依赖实战:多仓库的无缝集成
  • PHP建立MySQL持久化连接(长连接)及mysql与mysqli扩展的区别
  • 【Python爬虫(31)】解锁Python多线程编程:从入门到实战