【C/C++】哈理工oj-温格小姐的区间

Description:

下面是格温小姐!格温小姐锋利的剪刀可以夹住一定大小的物品,她现在遇到了一个区间问题,因此她突破了次元壁来找你寻求帮助

给定一个整数序列a1,a2,a3······an,和一个正整数d,你可以选定一个整数 l 与一个整数 r (l<=r && r - l <=d),倘若ai小于l,则使ai=l,倘若ai>r,则使ai=r

最终你要让这个整数数列中的Sum(|ai-ai+1|) (1 <= i <= n-1)最大,其中|x|为x的绝对值,请求出这个最大和

Input:

第一行为一个整数T (T <= 1000)代表样例个数

每个样例包含两行,第一行含两个整数,n (2 <= n <= 1000), d ( 1<= d <= 109)

第二行为n个整数a1,a2,a3······an   (-1000 <= ai <= 1000)

tips:使用O(n^2)算法可通过本题

Output:

每个样例输出一行包含最大整数,表示绝对值差之和的最大值

Sample Input:

1

8 3
3 1 4 1 5 9 2 6

Sample Output:

15

Hint:

在给定样例中,你可以将区间限制在[1,4],则原数组变成[3,1,4,1,4,4,2,4],答案为15

#include<stdio.h>
#include<iostream>
using namespace std;
int Sum(int*p, int m)//p表示框后的数组 m表示数组长度n
{
	int dif = 0;
	int sum = 0;
	for (int i = 0; i < m - 1; i++)
	{
		if (p[i]>=p[i + 1])
		{
			dif = p[i] - p[i + 1];
		}
		else
		{
			dif = (p[i] - p[i + 1])*(-1);
		}
		sum += dif;
	}
	return sum;
}
int main()
{
	int t;
	cin >> t;
	int n, d;
	int arr[1000];
	int arr1[1000];
	int min, max;
	int sum, sum_max;
	while (t--)
	{
		cin >> n >> d;
		sum = 0;
		sum_max = 0;
		for (int i = 0; i < n; i++)
		{
			cin >> arr[i];
			if (i == 0)
			{
				max = arr[0];
				min = arr[0];
			}
			else
			{
				if (arr[i]>max)
				{
					max = arr[i];
				}
				if (arr[i] < min)
				{
					min = arr[i];
				}
			}
		}
		//cout << min << max << endl;
		for (int i = min; i <= max; i++)
		{
			for (int j = 0; j < n; j++)
			{
				arr1[j] = arr[j];
			}//把arr复制一份给arr1
			for (int j = 0; j < n; j++)
			{
				if (arr[j] < i)
				{
					arr1[j] = i;
				}
				else if (arr[j]>i + d)
				{
					arr1[j] = i + d;
				}//把arr1变成框在区间[l,l+d]内的数组
			}
			/*for (int k = 0; k < n; k++)
			{
			cout << arr1[k];
			}
			cout << endl;*/
			sum = Sum(arr1, n);//传参arr1
			if (i == min)
			{
				sum_max = sum;
			}
			else if (sum>sum_max)
			{
				sum_max = sum;
			}
		}
		cout << sum_max << endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值