Codeforces Round #619 (Div. 2)—B. Motarack’s Birthday
提示:题目链接
题意:
给定一个有n个元素的序列a,现在a中缺少一些元素,空缺位置的值为-1。要求在每一个空缺的位置上给定一个相同的元素替换-1,使得这个序列中相邻两数之差的最大绝对值尽可能的小,输出所求元素k以及相邻两数之差的最大绝对值的最小值m
解题思路:
- 遍历这个序列统计两个变量:与空缺位置相邻的数里的最大值mmax和最小值mmin
- 必须相邻的原因是:如果一个数不和空缺位置相邻的话,空缺位置不论填什么都和这个数没有关系
- 然后令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;
}