第36次CCF计算机软件能力认证 梦境巡查

时间:2024-12-18 09:59:38

梦境巡查

刷新 

时间限制: 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。

参考答案

#include<bits/stdc++.h>
using namespace std;
const int N=2e5;
int a[N],b[N];
int n,w,wi,buji,k;

int main()
{
	
	cin>>n;
	for(int i=0;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin>>b[i];
	}
	//当前状态
	w=a[0];
	//最终答案
	wi=a[0];
	for(int i=1;i<=n;i++)
	{//坏的是i
		for(int j=1;j<=n;j++)
		{
			//走到j,更新当前w
			w-=a[j-1];
			if(j==i)
			{
				buji=0;
			}
			else
			{
				buji=b[j];
			}
			//如果不够往下走
			if(w-a[j]+buji<0)
			{
				//差值
				k=a[j]-w-buji;
				//加到wi
				wi+=k;
			}
			//如果够
			else
			{
				w+=buji;
			}
		}
		cout<<wi<<' ';
	}
	return 0;
}