题目链接:
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距离前一个台阶的距离有多远,是否可以往前流来判断总距离
总结:对于需要多次查询的题目,尤其查询的次数还很多,判断是否可以预处理数据集,然后在查询的时候直接输出。