牛客挑战赛39 A.聚会

牛客挑战赛39 A.聚会

题目链接

题目描述

牛牛过生日啦!他决定在家里举办一场生日聚会。
通往牛牛家里的道路正好是一条无限长的道路,为了简单起见,我们把它想象成一条直线——关于 x x 的数轴。其中牛牛的家位于 x = 0 x=0 原点,想邀请 n n 位朋友参加本次生日聚会,其中第 i i 位朋友家居住在 x i x_i ​ 的位置,初始他们同时以 1 单位每秒的速度从家里出发前往聚会的地点。
为了朋友们尽早到达聚会地点,拥有魔法的牛牛决定在道路上的整数点上建立两个传送门,这样朋友们可以通过传送门从一个位置瞬间传送到另一个位置。
现在请聪明的你帮牛牛算一算,在最优策略下,朋友们最晚需要多长时间可以到达聚会地点?

输入描述:

第一行输入一个正整数 t ( 1 t 10 ) t (1 ≤ t ≤ 10) 表示数据组数,接下来每组数据:
第一行输入一个正整数 ( 1 n 1 0 5 ) (1 ≤ n ≤ 10^5) 表示聚会邀请的朋友数量。
第二行输入 n n 个整数,由空格间隔开,第 i i 个整数为 x i ( 1 0 9 x i 1 0 9 ) x_i( - 10^9 ≤ x_i ≤ 10^9 ) 描述第 i i 位朋友家里的位置。
输入保证 i = 1 t n i 1 0 6 \sum\limits_{i=1}^t n_i\le 10^6

输出描述:

对于每组数据,请输出一个非负整数,表示在最优的摆放传送门的策略下,朋友们最晚需要多长时间可以到达聚会地点。

示例1

输入

2
2
-2 1
3
4 5 6

输出

1
1

题目比较新颖,最优放置门的策略一定是在 i i 处放一道门,另一道门放在 0 0 的位置,那么对 0 0 i 1 i-1 的数直接走到 0 0 位置,最长时间为 a [ i 1 ] a[i-1] ,对 i i n n 的数直接走到 i i 位置,最长时间为 ( a [ n 1 ] a [ i ] + 1 ) / 2 (a[n-1]-a[i]+1)/2 ,因为在正中间放门是最优的,所以门的位置为 ( a [ i ] + a [ n 1 ] ) / 2 (a[i]+a[n-1])/2 ,最长时间就是 a [ n 1 ] ( a [ i ] + a [ n 1 ] ) / 2 a[n-1]-(a[i]+a[n-1])/2 ,因为向下取整的缘故这两个是相等的哦, ( a [ n 1 ] a [ i ] + 1 ) / 2 = a [ n 1 ] ( a [ i ] + a [ n 1 ] ) / 2 (a[n-1]-a[i]+1)/2=a[n-1]-(a[i]+a[n-1])/2 。这题还有一个坑点就是要分正负,只能在正数或者负数处插一道门,AC代码如下:

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

int calculate(vector<int>&q1,vector<int>&q2){
    int ans=inf,n=q1.size();
    for(int i=0;i<n;i++){
        ans=min(ans,max(i-1<0?0:q1[i-1],(q1[n-1]-q1[i]+1)/2));
    }
    return max(ans,q2.size()?q2.back():0);
}

int main(){
    int t;
    cin>>t;
    while(t--){
        int n,k,ans;
        cin>>n;
        vector<int>q1,q2;
        for(int i=0;i<n;i++){
            cin>>k;
            if(k<0) q1.push_back(-k);
            else q2.push_back(k);
        }
        sort(q1.begin(),q1.end());
        sort(q2.begin(),q2.end());
        ans=min(calculate(q1,q2),calculate(q2,q1));
        cout<<ans<<endl;
    }
    return 0;
}
发布了479 篇原创文章 · 获赞 38 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/105594522