B. Motarack’s Birthday

该博客主要讨论了Codeforces Round #619 (Div.2) - B. Motarack's Birthday问题,这是一个关于序列处理的算法题。题目要求在序列的空缺位置填充同一元素,以使相邻两数之差的绝对值最小。解题策略是遍历序列,找出与空缺位置相邻的数的最大值和最小值,然后取它们的平均值作为填充元素。通过这种方法,可以计算出相邻两数之差的最大绝对值的最小值和填充元素的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Codeforces Round #619 (Div. 2)—B. Motarack’s Birthday

提示:题目链接


题意:

给定一个有n个元素的序列a,现在a中缺少一些元素,空缺位置的值为-1。要求在每一个空缺的位置上给定一个相同的元素替换-1,使得这个序列中相邻两数之差的最大绝对值尽可能的小,输出所求元素k以及相邻两数之差的最大绝对值的最小值m

解题思路:

在这里插入图片描述

  1. 遍历这个序列统计两个变量:与空缺位置相邻的数里的最大值mmax和最小值mmin
  2. 必须相邻的原因是:如果一个数不和空缺位置相邻的话,空缺位置不论填什么都和这个数没有关系
  3. 然后令k=(mmax+mmin)/2,再次遍历一遍序列先把空缺位置填上k然后计算相邻两数之差并更新答案

源代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int MAXN = 2e5+5;
const int inf = 0x3f3f3f3f;
int a[MAXN], n;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(a , 0 , sizeof a);
        int cnt = 0;///统计数组中a[i] = -1的次数
        int mx = -inf;///mx代表数组中出现最大的值
        int mi = inf;///mi代表数组中除了-1之外出现最小的值
        int k, m = -inf;
        scanf("%d",&n);
        for(int i = 1 ; i <= n ; ++i)
            scanf("%d",&a[i]);
        for(int i = 1 ; i <= n ; ++i)
        {
            if(i > 1 && a[i] == -1 && a[i-1] != -1)
            {
                mx = max(mx , a[i-1]);
                mi = min(mi , a[i-1]);
            }
            if(i < n && a[i] == -1 && a[i+1] != -1)
            {
                mx = max(mx , a[i+1]);
                mi = min(mi , a[i+1]);
            }
            if(a[i] == -1)
                ++cnt;
        }
        if(cnt == n)
            printf("0 42\n");
        else
        {
            k = (mi + mx) / 2;
            for(int i = 1 ; i <= n ; ++i)
                if(a[i] == -1)
                    a[i] = k;
            for(int i = 1 ; i < n ; ++i)
                m = max(m , abs(a[i] - a[i+1]));
            printf("%d %d\n",m,k);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值