codeforces 1301B Motarack's Birthday 贪心

https://vjudge.net/problem/CodeForces-1301B
在这里插入图片描述题目大意:给一个数组 a a ,如果 a [ i ] = 1 a[i]=-1 ,那么 a [ i ] a[i] 将用 k k 来替代,令 m = M a x ( a b s ( a [ i ] a [ i 1 ] ) ) , 2 < = i < = n m=Max(abs(a[i]-a[i-1])),2<=i<=n 。问当 k k 为何值时, m m 是最小的。

思路:首先把不受 k k 影响的部分计算出来,设为 a n s ans 。然后把受 k k 影响的 a i a_i 拿出来放到数组 b b 中,设有 l e n len 个元素,那么答案就是: a n s = M a x ( a n s , a b s ( k b [ i ] ) ) , 1 < = i < = l e n ans=Max(ans,abs(k-b[i])),1<=i<=len 。我们将数组 b b 从大到小排序,不难发现 a b s ( k b [ i ] ) abs(k-b[i]) 的最大值要么是 a b s ( k b [ 1 ] ) abs(k-b[1]) ,要么是 a b s ( k b [ l e n ] ) abs(k-b[len]) ,那么要使这两个值中的最大值最小,自然应该令 k = ( b [ 1 ] + b [ l e n ] ) / 2 k=(b[1]+b[len])/2

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

const int maxn=1e5+5;

int n;
int a[maxn];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int ans=0,MAX=0,MIN=INF;
        for(int i=2;i<=n;i++)
        {
            if(a[i]==-1&&a[i-1]!=-1)
                MAX=max(MAX,a[i-1]),MIN=min(MIN,a[i-1]);
            else if(a[i]!=-1&&a[i-1]!=-1)
                ans=max(ans,abs(a[i]-a[i-1]));
            else if(a[i]!=-1&&a[i-1]==-1)
                MAX=max(MAX,a[i]),MIN=min(MIN,a[i]);
        }
        if(MIN==INF)
            printf("%d 0\n",ans);
        else
        {
            int mid=MAX+MIN>>1;
            ans=max(ans,max(mid-MIN,MAX-mid));
            printf("%d %d\n",ans,mid);
        }
    }
    return 0;
}

发布了677 篇原创文章 · 获赞 30 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/xiji333/article/details/104313635
今日推荐