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

CCF-CSP第36次认证第二题——梦境巡查【NA!!前缀和思想】

CCF-CSP第36次认证第二题——梦境巡查

时间限制: 1.0 秒

空间限制: 512 MiB

相关文件: 题目目录

题目背景

传说每当月光遍布西西艾弗岛,总有一道身影默默守护着居民们的美梦。

题目描述

梦境中的西西艾弗岛由 𝑛+1n+1 个区域组成。梦境巡查员顿顿每天都会从梦之源(00 号区域)出发,顺次巡查 1,2,⋯,𝑛1,2,⋯,n 号区域,最后从 𝑛n 号区域返回梦之源。

在梦境中穿梭需要消耗美梦能量:

  • 从梦之源出发时,顿顿会携带若干初始能量;
  • 从第 𝑖i 号区域前往下一区域(0≤𝑖≤𝑛0≤i≤n)需要消耗 𝑎𝑖ai​ 单位能量,因此从第 𝑖i 号区域出发时,顿顿剩余的美梦能量需要大于或等于 𝑎𝑖ai​ 单位;
  • 顺利到达第 𝑖i 号区域(1≤𝑖≤𝑛1≤i≤n)后,顿顿可以从当地居民的美梦中汲取 𝑏𝑖bi​ 单位能量作为补给。

假设顿顿初始携带 𝑤w 单位美梦能量,那么首先需要保证 𝑤≥𝑎0w≥a0​,这样顿顿便可消耗 𝑎0a0​ 能量穿梭到 11 号区域、进而获得 𝑏1b1​ 单位能量补给。巡查 11 号区域后,顿顿剩余能量为 𝑤−𝑎0+𝑏1w−a0​+b1​,如果该数值大于或等于 𝑎1a1​,顿顿便可继续前往 22 号区域。依此类推,直至最后消耗 𝑎𝑛an​ 单位能量从 𝑛n 号区域返回梦之源,便算是顺利完成整个巡查。西西艾弗岛,又迎来安宁的一夜,可喜可贺!

img

作为一个成熟的梦境巡查员,顿顿已经知晓初始需要携带多少能量可以保证顺利完成巡查。但在一些意外状况下,比如学生们受期末季的困扰而无法安眠,顿顿可能在某些区域无法采集足够的美梦能量。此时,便需要增加初始携带量以备万全。

具体来说,考虑一个简单的情况:在 11 到 𝑛n 号区域中,有且仅有一个区域发生意外,顿顿无法从该区域获得能量补给。 如果第 𝑖i 号区域(1≤𝑖≤𝑛1≤i≤n)发生意外(即 𝑏𝑖bi​ 变为 00),则此时为顺利完成巡查,顿顿从梦之源出发所携带的最少初始能量记作 𝑤(𝑖)w(i)。

试帮助顿顿计算 𝑤(1),𝑤(2),⋯,𝑤(𝑛)w(1),w(2),⋯,w(n) 的值。

输入格式

从标准输入读入数据。

输入共三行。

输入的第一行包含一个整数 𝑛n。

输入的第二行包含 𝑛+1n+1 个整数 𝑎0,𝑎1,𝑎2,⋯,𝑎𝑛a0​,a1​,a2​,⋯,an​。

输入的第三行包含 𝑛n 个整数 𝑏1,𝑏2,⋯,𝑏𝑛b1​,b2​,⋯,bn​。

输出格式

输出到标准输出。

输出仅一行,包含空格分隔的 𝑛n 个整数 𝑤(1),𝑤(2),⋯,𝑤(𝑛)w(1),w(2),⋯,w(n)。

样例1输入

3
5 5 5 5
0 100 0

样例1输出

10 20 10

样例1解释

11 和 33 号区域本身便没有补给,需要携带 1010 单位初始能量抵达 22 号区域,获得 22 号区域的大量补给后便可顺利完成巡查;

22 号区域发生意外,则全程没有补给,初始需携带 2020 单位能量。

样例2输入

3
9 4 6 2
9 4 6

样例2输出

15 10 9

子任务

8080 的测试数据保证 0<𝑛≤10000<n≤1000;

全部测试数据保证 0<𝑛≤1050<n≤105 且 0≤𝑎𝑖,𝑏𝑖≤10000≤ai​,bi​≤1000。

参考思路

参考视频:【202412(第36次)CSP真题202412-1,2讲解】 https://www.bilibili.com/video/BV1XkfjYsEsj/?share_source=copy_web&vd_source=9d80e7e6ef9c3f34266696356fc5543f

【刚开始没看懂,后来自己在草稿纸上画图演算突然醒悟了】

哔哩哔哩

参考题解 

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int main () {
	int n;
	cin >> n;
	vector<int> a(n + 1);
	for(int i = 0; i <= n; i++) {
		cin >> a[i];
	}
	vector<int> b(n + 1);
	for(int i = 1; i <= n; i++) {
		cin >> b[i];
	}
	
	vector<int> sum(n + 1);//前缀和数组,相当于草稿纸上用到的wi
	vector<int> pre_max(n + 1);//前缀和的最大值 
	sum[0] = a[0];
	pre_max[0] = sum[0];
	for(int i = 1; i <= n; i++) {
		sum[i] = sum[i - 1] + a[i] - b[i];
		pre_max[i] = max(sum[i], pre_max[i - 1]);
	}
	vector<int> suf_max(n + 1);//后缀和的最大值 
	suf_max[n] = sum[n];
	for(int i = n - 1; i >= 1; i--) {
		suf_max[i] = max(sum[i], suf_max[i + 1]);
	}
	//输出结果 
	for(int i = 1; i <= n; i++) {
		int ans = max(pre_max[i - 1], suf_max[i] + b[i]);
		cout << ans << " ";
	}
	return 0;
}

总结

前缀和,后缀和

前缀和和后缀和是两种常见的思想,用于快速计算数组(或序列)中某个范围内的和。它们通过预处理数据来减少后续操作的时间复杂度,常用于解决一些涉及区间求和的问题。

  1. 前缀和

    • 前缀和是一个累积和的概念,表示数组中每个元素及其前面所有元素的和。即 prefix[i] = arr[0] + arr[1] + ... + arr[i]
    • 利用前缀和数组,给定一个区间 [l, r],区间和可以通过 prefix[r] - prefix[l-1] 快速计算出来,从而减少了区间和计算的时间复杂度,从 O(n) 降低到 O(1)。
  2. 后缀和

    • 后缀和与前缀和相似,但它是从数组的末尾向前累积的。即 suffix[i] = arr[i] + arr[i+1] + ... + arr[n-1]
    • 使用后缀和数组,类似地,给定区间 [l, r] 的后缀和也可以快速计算。

这两种思想主要用于优化范围查询问题,尤其是在需要频繁计算区间和的场景下,非常有效。

相同输入,多次运行结果不同的可能原因

1. 未定义行为 (Undefined Behavior)

  • 越界访问数组:访问数组时,超出了数组的边界,导致程序读取未定义的内存区域,产生不稳定的结果。
  • 空指针或悬空指针:在未初始化或已删除的指针上进行操作,会导致访问错误的内存位置。
  • 数据竞争:在多线程程序中,如果多个线程同时访问和修改共享数据而没有适当的同步措施,可能会导致数据不一致。
  • 使用未初始化的变量:未初始化的局部变量有时会包含垃圾值,导致程序行为不可预测。

2. 随机数

  • 如果程序依赖于随机数生成(如 rand()std::random),且未正确设置随机种子(如未调用 srand() 或使用不稳定的种子),则每次运行时随机数序列可能不同,从而导致不同的结果。

3. 多线程或并发问题

  • 线程调度不确定性:在并发程序中,线程的执行顺序由操作系统决定,如果没有正确的同步机制,多个线程同时访问共享资源时可能导致竞态条件(race conditions),从而导致结果不稳定。
  • 死锁或活锁:多个线程相互等待对方释放资源,导致程序挂起或无限循环,可能在不同的执行中表现不同。

感想

 这道题刚开始一直想不通,在网上看了别人的题解,也问了deepseek等等,还是不太理解,就先放一边了,隔了几天又去看才想明白,这次只花了一个小时完成思路整理和编程,还是比较满意的,写完以后也还是很有成就感的。

这道题难点在于思路,建议先当作数学题,推出求解过程,想清楚如何求解。


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

相关文章:

  • python爬虫系列课程1:初识爬虫
  • 鸿蒙NEXT开发-元服务的基本介绍和创建
  • 数据库连接池与池化思想
  • 2024年国赛高教杯数学建模C题农作物的种植策略解题全过程文档及程序
  • 文档检测校正的重要性
  • 自制简单的图片查看器(python)
  • Maven 构建性能分析:瓶颈排查与优化建议
  • 搜索旋转数组
  • 基于SpringBoot+Vue的在线电影购票系统的设计与实现
  • Visual Studio Code的下载安装与汉化
  • Medians
  • 前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传
  • Windows 环境下 Grafana 安装指南
  • 【够用就好002-2】发布github项目仓库补充
  • 现代卷积神经网络
  • [环境配置] 环境配置 - Java - Apache Maven 安装与配置
  • Redis+Lua脚本实现限流
  • Step-Video-T2V:阶跃星辰发布最强开源视频生成模型(论文详解)
  • 数字滤波器的设计实现及应用(论文+仿真)
  • spark任务运行