前缀极差(C语言)

#include<stdio.h>
int main()
{
	int n = 0, k = 0, max = 0, min = 0, number = 0;;
	int num[100000], numB[100000];
    //n来限制输入数字的个数,k用来表示询问的次数
    //max来存储随着输入数字的极大值的更改,min是极小值
    //number用来存储之后询问所输入的数字
	scanf("%d %d", &n, &k);
	scanf("%d", &num[0]);
	max = num[0];
	min = num[0];
	numB[1] = max - min;
    //numB从下标为1的位置开始存储,因为数字个数没有可能是0
    //num存储输入的数字,numB存储对应下标个数数字的极差
	for (int i = 1; i < n; i++) 
	{
		scanf("%d", &num[i]);
		if (num[i] > max) 
		{
			max = num[i];
		}
		if (num[i] < min) 
        {
			min = num[i];
		}
		numB[i + 1] = max - min;
        //每输入一个数字,就对numB进行一次计算
	}
	k--;
	scanf("%d", &number);
	printf("%d", numB[number]);
	while (k!=0) 
	{
		scanf("%d", &number);
		printf(" %d", numB[number]);
	}
}

对于这道题来说,直接对输入的数字进行极差运算比之后询问是再进行计算的时间效率要高很多,如果在输入完数字之后对于询问的会报超时

思路非常简单

首先对数据进行输入,并且随着数据的输入对于不同数量数字进行极差运算,存储在集合numB中,所以当进行询问的时候直接打印numB所对应位置的极差就可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值