NanoApe Loves Sequence(思维)

Problem Description:

NanoApe, the Retired Dog, has returned back to prepare for the National Higher Education Entrance Examination!
In math class, NanoApe picked up sequences once again. He wrote down a sequence with n numbers on the paper and then randomly deleted a number in the sequence. After that, he calculated the maximum absolute value of the difference of each two adjacent remained numbers, denoted as F.
Now he wants to know the expected value of F, if he deleted each number with equal probability.

Input:

The first line of the input contains an integer T, denoting the number of test cases.
In each test case, the first line of the input contains an integer n, denoting the length of the original sequence.
The second line of the input contains n integers A1,A2,…,An, denoting the elements of the sequence.
1≤T≤10, 3≤n≤100000, 1≤Ai≤109

Output:

For each test case, print a line with one integer, denoting the answer.
In order to prevent using float number, you should print the answer multiplied by n.

Sample Input:

1
4
1 2 3 4

Sample Output

6
问题描述:
题干为求给定一个序列,任意删除其中一个数,得到新序列相邻两个数差的绝对值的最大值f,将所有f的可能求和得到n,输出n。
解题思路:
根据题意,最先可以想到直接暴力所有可能性求解,因为对于删除第一位或最后一位,其他序列的相对位置不发生变化;对于删除其他第i位置,只有第i位左右的差绝对值变为abs(x[i+1]-x[i-1]),其他相对位置不变;由此可知,单纯暴力会产生很多的重复计算导致超时;
我们可以先删除第一位和最后一位分别得出从前向后和从后向前的差绝对值数组a[]和b[],再对其他项的abs(x[i+1]-x[i-1])与a[i-1]和b[i+1]取最大就行。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long x[100010],a[100010],b[100010];
int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		cin>>n;
		long long ans=0;
		for(int i=0;i<n;i++)
		   cin>>x[i];
		for(int i=1;i<n;i++)
		    a[i]=max(a[i-1],abs(x[i]-x[i-1]));   //从前向后
		for(int i=n-2;i>=0;i--)
		    b[i]=max(b[i+1],abs(x[i+1]-x[i]));   //从后向前
		for(int i=0;i<n;i++)
		{
			if(i!=0&&i!=n-1)
			  ans+=max(max(a[i-1],b[i+1]),abs(x[i-1]-x[i+1]));
			else
			  ans+=max(a[i-1],b[i+1]);
		}
        cout<<ans<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值