题目:传送门

题意:题目说的是求期望,其实翻译过来意思就是:一个长度为 n 的数列(n>=3),按顺序删除其中每一个数,每次删除都是建立在最原始数列的基础上进行的,算出每次操作后得到的新数列的相邻两数的差的绝对值的最大值,求这些n个最大值的总和。

题解:把n=3的情况单独拿出来直接算出来,就是abs(data[3]-data[2])+abs(data[2]-data[1])+abs(data[3]-data[1]),然后讨论n>=4的情况。首先遍历求出原始数列的相邻两数的差的绝对值的最大值mx,设这两个相邻的数的下标为mi-1mi,我们在本题中以右边mi基准。然后依次考虑删除mi-1mi这两个点的时候的情况,也就是说求出没有mi-1这个点的时候得到的最大值,再求出没有mi这个点的时候得到的最大值,设他俩分别为mx2mx3,用if continue就可以实现,就是循环到那个点的时候跳过两次就行了,为什么要跳过两次呢?因为删去一个点会影响到他右边这两个数作为基准求最大值的情况,两边所以要跳过两次。这样数据就够用了可以求答案了。

随后考虑把两端的点删除的时候的最大值,不一定是mx+mx,如果mi-1==1或者mi==n要单独考虑初始值,用if判断一下即可,比如 1 7 100 6这组数据就是mi==n的情况,答案是94+99+6+93=292,初始值是94+93=187,也就是mx+mx3,在纸上写一下就很容易明白了。随后进行遍历即可,遍历过程就是考虑在2n-1这些数中依次删去每个数看abs(data[i+1]-data[i-1])是否比现有的最大值还要大,取其中较大值加到ans里即可,但是不要更新最大值,因为那样是不对的,另外注意这里的最大值不是同一个,对于非mimi-1这两个点的点来说最大值是mx,对于mi-1来说最大值是mx2,对于mi来说最大值是mx3。具体过程请看代码,如果有没看懂的或者更好的解决办法欢迎大家留言给我。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <iostream>
using namespace std;
const int maxn=1e5+;
typedef long long ll;
ll data[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
ll mx=-,mi=-,tmp;
memset(data,-,sizeof(data));
for(int i=; i<=n; i++)
scanf("%lld",&data[i]);
ll ans=;
if(n==)
{
// cout<<abs(data[3]-data[2])<<endl;
// cout<<abs(data[3]-data[1])<<endl;
// cout<<abs(data[2]-data[1])<<endl;
ans=ans+abs(data[]-data[])+abs(data[]-data[])+abs(data[]-data[]);
printf("%lld\n",ans);
continue;
}
for(int i=; i<=n; i++)
{
tmp=abs(data[i]-data[i-]);
if(tmp>mx)
{
mx=tmp;
mi=i;
}
}
ll mx2=-,m2i=-;
for(int i=; i<=n; i++)
{
if(i==mi-||i==mi) continue;
tmp=abs(data[i]-data[i-]);
if(tmp>mx2)
{
mx2=tmp;
m2i=i;
}
}
ll mx3=-,m3i=-;
for(int i=; i<=n; i++)
{
if(i==mi+||i==mi) continue;
tmp=abs(data[i]-data[i-]);
if(tmp>mx3)
{
mx3=tmp;
m3i=i;
}
}
//cout<<mx2<<endl<<mx3<<endl;
if(mi==n)
ans=mx+mx3;
else if(mi==)
ans=mx+mx2;
else
ans=mx+mx;
//cout<<ans<<endl;
for(int i=; i<=n-; i++)
{
if(i==mi-)//代表mi-1和mi
{
tmp=abs(data[i+]-data[i-]);
if(tmp>mx2)
ans+=tmp;
else
ans+=mx2;
}
else if(i==mi) //代表mi和mi+1
{
tmp=abs(data[i+]-data[i-]);
if(tmp>mx3)
ans+=tmp;
else
ans+=mx3;
}
else
{
tmp=abs(data[i+]-data[i-]);
if(tmp>mx)
ans+=tmp;
else
ans+=mx;
}
}
printf("%lld\n",ans);
}
return ;
}

HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002的更多相关文章

  1. HDU 5805 NanoApe Loves Sequence (模拟)

    NanoApe Loves Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5805 Description NanoApe, the ...

  2. HDU 5805 - NanoApe Loves Sequence (BestCoder Round #86)

    先找相邻差值的最大,第二大,第三大 删去端点会减少一个值, 删去其余点会减少两个值,新增一个值,所以新增和现存的最大的值比较一下取最大即可 #include <iostream> #inc ...

  3. HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...

  4. HDU 5805 NanoApe Loves Sequence

    处理出每个位置左边的最大值和右边的最大值.然后就可以o(1)计算去掉某位置的最大值了. #pragma comment(linker, "/STACK:1024000000,10240000 ...

  5. Hdu 5806 NanoApe Loves Sequence Ⅱ(双指针) (C++,Java)

    Hdu 5806 NanoApe Loves Sequence Ⅱ(双指针) Hdu 5806 题意:给出一个数组,求区间第k大的数大于等于m的区间个数 #include<queue> # ...

  6. 5805 NanoApe Loves Sequence(想法题)

    传送门 NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K ( ...

  7. HDU 5806 NanoApe Loves Sequence Ⅱ (模拟)

    NanoApe Loves Sequence Ⅱ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5806 Description NanoApe, t ...

  8. HDU 5806 - NanoApe Loves Sequence Ⅱ (BestCoder Round #86)

    若 [i, j] 满足, 则 [i, j+1], [i, j+2]...[i,n]均满足 故设当前区间里个数为size, 对于每个 i ,找到刚满足 size == k 的 [i, j], ans + ...

  9. HDU 5806 NanoApe Loves Sequence Ⅱ ——(尺取法)

    题意:给出一个序列,问能找出多少个连续的子序列,使得这个子序列中第k大的数字不小于m. 分析:这个子序列中只要大于等于m的个数大于等于k个即可.那么,我们可以用尺取法写,代码不难写,但是有些小细节需要 ...

随机推荐

  1. NOI题库

    07:机器翻译 总时间限制: 1000ms 内存限制: 65536kB 描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个 ...

  2. Matlab最短路径问题记录

    利用graphshortestpath 可以求最短路径,具体用法参考MATLAB帮助 S=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量 E=[2 3 5 4 4 6 ...

  3. 在Ubuntu下安装*.sh

    在Ubuntu下安装*.sh和*.bin的方法 [日期:2009-12-07] 来源:Linux公社  作者:Linux编辑 [字体:大 中 小]   记下在Ubuntu下安装*.sh和*.bin的简 ...

  4. SpringMVC配置

    博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 4  文章- 1  评论- 0  搭建springmvc框架的另一种思路 在一个完整的项目里搭建springmvc框架的时候, 通常情况下,初学者 ...

  5. POJ1201 Intervals

    Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a p ...

  6. TCP/IP详解 笔记十

    IGMP Internet组管理协议 IGMP的作用:让一个物理网络上的所有系统知道主机所在的多播组: 让路由器知道多播数据报应该向哪个端口转发. IGMP有固定长度,没有可选数据,在ip头部的协议值 ...

  7. IOS基础之 (八) Foundation框架

    一 常用类 NSRange 范围,NSPoint  点,NSSize /CSSize 大小,CGRect 1 NSRange 1)NSRange是一种C语言结构用来帮助描述一系列的条款,包括一个起点位 ...

  8. 使用Navicat V8.0创建数据库,外键出现错误ERROR 1005: Can’t create table (errno: 121)

    ERROR 1005: Can't create table (errno: 121) errno 121 means a duplicate key error. Probably the tabl ...

  9. yield return 和 yield break

    //yield return 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 IEnumerator<T>. static I ...

  10. JS实现打字机式字符输出效果

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...