2023河南萌新联赛第(二)场:河南工业大学 补题 A.自动收小麦机

文章讲述了2023年河南萌新联赛中的一个编程题目,涉及一个非递减序列和流水收集小麦的问题。通过使用前缀和计算小麦数量,以及动态规划方法确定水流距离,求解最多可收获的小麦数。对于多次查询的情况,文章强调了预处理数据集的重要性以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

A-自动收小麦机_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)

题目大意:

一个不递减的序列,一桶水到一个平面上可以最多流k格,如果流到了下一个阶梯,就又重新计算流动的距离,每个格子上有不同数量的小麦,问最多可以收获多少小麦。

题目思路:

用前缀和统计小麦的数量,h记录阶梯高度,s1数组记录当前平面流动水流距离,s2[i]数组记录从 i 倒水可以最长流动距离。

如果h[i]的高度不等于h[i-1],则s1[i]=1,否则,累加距离。

判断当前的s1[i]是否小于k,小于就可以流到下一层,s1[i]=s1[i-1],否则,计算在此平面上最长可以流的距离。

q次查询直接输出查询结果即可。

代码实现:

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#define int long long
using namespace std;
const int N=1e6+10;
int h[N],sum[N];
int s1[N],s2[N];
int n,q,k;
signed main()
{
	cin>>n>>q>>k;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		sum[i]=sum[i-1]+x;//前缀和
	}
	int p=1;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
		if(h[i]!=h[i-1])s1[i]=1,p=1;
		else s1[i]=p;
		p++;
		if(s1[i]<k)s2[i]=s2[i-1];
		else s2[i]=i-k+1;
	}
	while(q--)
	{
		int x;
		cin>>x;
		cout<<sum[x]-sum[s2[x]-1]<<endl;//区间和,s2[i]最远能流到的距离
	}
	return 0;
}
//s1,s2数组,一个表示距离前一个台阶的距离,一个表示可以留的总距离
//这里是通过判断当前x距离前一个台阶的距离有多远,是否可以往前流来判断总距离

总结:对于需要多次查询的题目,尤其查询的次数还很多,判断是否可以预处理数据集,然后在查询的时候直接输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值