牛客挑战赛39 A.聚会
题目描述
牛牛过生日啦!他决定在家里举办一场生日聚会。
通往牛牛家里的道路正好是一条无限长的道路,为了简单起见,我们把它想象成一条直线——关于
的数轴。其中牛牛的家位于
原点,想邀请
位朋友参加本次生日聚会,其中第
位朋友家居住在
的位置,初始他们同时以 1 单位每秒的速度从家里出发前往聚会的地点。
为了朋友们尽早到达聚会地点,拥有魔法的牛牛决定在道路上的整数点上建立两个传送门,这样朋友们可以通过传送门从一个位置瞬间传送到另一个位置。
现在请聪明的你帮牛牛算一算,在最优策略下,朋友们最晚需要多长时间可以到达聚会地点?
输入描述:
第一行输入一个正整数
表示数据组数,接下来每组数据:
第一行输入一个正整数
表示聚会邀请的朋友数量。
第二行输入
个整数,由空格间隔开,第
个整数为
描述第
位朋友家里的位置。
输入保证
输出描述:
对于每组数据,请输出一个非负整数,表示在最优的摆放传送门的策略下,朋友们最晚需要多长时间可以到达聚会地点。
示例1
输入
2
2
-2 1
3
4 5 6
输出
1
1
题目比较新颖,最优放置门的策略一定是在 处放一道门,另一道门放在 的位置,那么对 到 的数直接走到 位置,最长时间为 ,对 到 的数直接走到 位置,最长时间为 ,因为在正中间放门是最优的,所以门的位置为 ,最长时间就是 ,因为向下取整的缘故这两个是相等的哦, 。这题还有一个坑点就是要分正负,只能在正数或者负数处插一道门,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;
}