一、题目
蒜头君有 nnn 个数,他提出了 qqq 个问题,每个问题是说,询问前 xxx 个数的极差(最大值减最小值)。你能帮助他解决这 qqq 个问题吗?
Input
第一行两个整数 n,q(1≤n,q≤105)n, q(1 \leq n, q \leq 10 ^ 5)n,q(1≤n,q≤105)
第二行 nnn 个整数 ai(1≤ai≤109)a_i(1 \leq a_i \leq 10 ^ 9)ai(1≤ai≤109)
表示蒜头君的 nnn 个数第三行 qqq 个整数 xi(1≤xi≤n)x_i(1 \leq x_i \leq n)xi(1≤xi≤n) ,表示每一次询问
Output
输出一行,包含 qqq 个整数,表示每一次询问的答案
Sample 1
Inputcopy Outputcopy
5 5
3 2 4 5 1
1 2 3 4 5
0 1 2 3 4
二、解决方案
1.思路
①这道题根据题意,我们要计算先x项的极差,那我们就要知道前x项的最大值与最小值,在之前写的代码中,我在for循环里每一次计算前x项的极差,最后的结果是超时的。
②所以为了更简化我们的代码,我们再输入数字的时候就提前把它前x项的最大值与最小值计算出来,后面直接用即可,就避免了重复的运算
——————————————
2.代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n=0,q=0;
scanf("%d %d",&n,&q);
int arr[100005]={0};
int max[100005]={0},min[100005]={0};
for(int i=1;i<=n;i++)
{
scanf("%d",&arr[i]);
if(i==1)
{
max[i]=arr[i],min[i]=arr[i];
}
else
{
max[i] = max[i-1]>arr[i]?max[i-1]:arr[i];
min[i] = min[i-1]<arr[i]?min[i-1]:arr[i];
}
}
int x=0;
for(int i=0;i<q;i++)
{
scanf("%d",&x);
printf("%d ",max[x]-min[x]);
}
return 0;
}