您的位置:首页 > 产品设计 > UI/UE

HDU-5805-NanoApe Loves Sequence(水题)

2016-08-08 21:30 288 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5805

题意:给出一个数组,求去掉1个数字后相邻两数字差的最大值的期望*n,

题解:就是求去掉每个数字后相邻两数差最大值的和,笨笨的维护下前三大值就好;

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5+7;
int Scan()
{
int res=0,ch,flag=0;
if((ch=getchar())=='-')flag=1;
else if(ch>='0'&&ch<='9')res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-'0';
return flag?-res:res;
}
void Out(int a)
{
if(a>9)Out(a/10);
putchar(a%10+'0');
}
int a[maxn];
int main()
{
int T;
scanf("%d",&T);
int n,m;
// long long ans=0;
while(T--)
{
int Max=0,Max2=0,Max3=0;
scanf("%d",&n);
// int c=0;
for(int i=0; i<n; ++i)
{
scanf("%d",&a[i]);
if(i>0)
{
int p=abs(a[i]-a[i-1]);
if(p>Max)
{
Max3=Max2;
Max2=Max;
Max=p;

// c=0;
}
else if(p>Max2)
{
Max3=Max2;
Max2=p;
}
else if(p>Max3)
{
Max3=p;
}
// if(p=Max)c++;
}
}
// cout<<Max<<" "<<Max2<<" "<<Max3<<endl;
long long ans=0;
if(abs(a[1]-a[0])==Max && Max2!=Max)ans+=Max2;
else ans+=Max;
if(abs(a[n-1]-a[n-2])==Max && Max2!=Max)ans+=Max2;
else ans+=Max;
for(int i=1; i<n-1; ++i)
{
int x=abs(a[i+1]-a[i]);
int y=abs(a[i]-a[i-1]);
int z=abs(a[i+1]-a[i-1]);
if(x<y)swap(x,y);
if(z>=Max)
{
ans+=z;
}
else if(x==Max && y==Max2)
{
ans+=max(Max3,z);
}
else if(x==Max)
{
ans+=max(Max2,z);
}
else
{
ans+=Max;
}
}
cout<<ans<<endl;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: