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;
}