首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【HDU】5805 - NanoApe Loves Sequence(模拟)

【HDU】5805 - NanoApe Loves Sequence(模拟)

作者头像
FishWang
发布2025-08-27 09:56:26
发布2025-08-27 09:56:26
1640
举报

点击打开题目

NanoApe Loves Sequence

Accepts: 531

Submissions: 2481

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 262144/131072 K (Java/Others)

问题描述

代码语言:javascript
复制
退役狗 NanoApe 滚回去学文化课啦!

在数学课上,NanoApe 心痒痒又玩起了数列。他在纸上随便写了一个长度为 nn 的数列,他又根据心情随便删了一个数,这样他得到了一个新的数列,然后他计算出了所有相邻两数的差的绝对值的最大值。

他当然知道这个最大值会随着他删了的数改变而改变,所以他想知道假如全部数被删除的概率是相等的话,差的绝对值的最大值的期望是多少。

输入描述

代码语言:javascript
复制
第一行为一个正整数 TT,表示数据组数。

每组数据的第一行为一个整数 nn。

第二行为 nn 个整数 A_iA​i​​,表示这个数列。

1 \le T \le 10,~3 \le n \le 100000,~1 \le A_i \le 10^91≤T≤10, 3≤n≤100000, 1≤A​i​​≤10​9​​

输出描述

代码语言:javascript
复制
对于每组数据输出一行一个数表示答案。

为防止精度误差,你需要输出答案乘上 nn 后的值。

输入样例

代码语言:javascript
复制
1
4
1 2 3 4

输出样例

代码语言:javascript
复制
6

我的第一想法是求出来最大的和第二大的,如果当前数的位置不是最大数的位置,那么就取最大值与当前数去掉左右两个数的值得差的最大值。如果去掉的是最大值,那就取第二大的和当前数左右两数的差的最大值。

但是后来有一点我没有考虑,就是如果最大的和第二大的挨着,如果去掉最大的,第二大的同样不能用,那么就要出问题,幸亏的提交之前想到这个问题了,及时改正。

那么我就再记录一个第三大的数,如果和上面所说的情况一样,那么就取第三大的数与之比较。

代码如下:

代码语言:javascript
复制
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))
struct node
{
    int v;
    int pos;
}max1,max2,max3,tt;
int main()
{
    int u;
    int n;
    __int64 ans;
    int num[100000+11];
    scanf ("%d",&u);
    while (u--)
    {
        scanf ("%d",&n);
        ans = 0;
        scanf ("%d",&num[1]);
        max1.v = 0;
        max2.v = 0;
        max3.v = 0;
        for (int i = 2 ; i <= n ; i++)
        {
            scanf ("%d",&num[i]);
            if (abs(num[i] - num[i-1]) > max1.v)
            {
                max3 = max2;
                max2 = max1;
                max1.v = abs(num[i] - num[i-1]);
                max1.pos = i;
            }
            else if (abs(num[i] - num[i-1]) > max2.v)
            {
                max3 = max2;
                max2.v = abs(num[i] - num[i-1]);
                max2.pos = i;
            }
            else if (abs(num[i] - num[i-1]) > max3.v)
            {
                max3.v = abs(num[i] - num[i-1]);
                max3.pos = i;
            }
        }
        if (max1.pos == 2)
            ans += max2.v;
        else
            ans += max1.v;
        if (max1.pos == n)
            ans += max2.v;
        else
            ans += max1.v;
        for (int i = 2 ; i < n ; i++)
        {
            if (max1.pos != i && max1.pos - 1 != i)
                ans += max (max1.v , abs(num[i-1] - num[i+1]));
            else
            {
                if (max1.pos == i+1)
                {
                    if (max2.pos == i)
                    {
                        ans += max (max3.v , abs(num[i-1] - num[i+1]));
                    }
                    else
                    {
                        ans += max (max2.v , abs(num[i-1] - num[i+1]));
                    }
                }
                else
                {
                    if (max2.pos == max1.pos + 1)
                    {
                        ans += max (max3.v , abs(num[i-1] - num[i+1]));
                    }
                    else
                    {
                        ans += max (max2.v , abs(num[i-1] - num[i+1]));
                    }
                }
            }
        }
        printf ("%I64d\n",ans);
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NanoApe Loves Sequence
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档