题目链接
https://www.luogu.com.cn/problem/P1007
精彩的思维点在于:两个相对的士兵经过时,因为转身不耗时,可以看作互不影响的前进。
#include<bits/stdc++.h>
#define int long long
const int n = 5e3+5;
using std::cin;
using std::cout;
using std::min;
using std::max;
//一个士兵的结构
// a 是位置,st 是 a 距离起点 0 的距离, fi 是 a 距离终点 L+1 的距离
struct stand {
int a,st,fi;
int mi , mx;
}p[n];
signed main(){
int L,N;
cin>>L;
cin>>N;
//特判 0 个士兵,不用输出
//是测试点 1 ,当时提交错了两次(只有 90 分)
if(N==0){
cout<<0<<' '<<0;
return 0;
}
// 起点和终点
int start = 0,final = L+1;
// 最终输出的最少分钟和最多分钟
int minn = -1,maxx = -1;
// N 个士兵的数据读入
for(int i=1;i<=N;i++){
cin>>p[i].a;
// 士兵距离起点
p[i].st = p[i].a-start;
// 士兵距离终点
p[i].fi = final - p[i].a;
// 单个士兵 st 和 fi 二者的较小值
p[i].mi = min(p[i].st,p[i].fi);
// 单个士兵 st 和 fi 二者的较大值
p[i].mx = max(p[i].st,p[i].fi);
// 遍历每个士兵找出所有士兵的 mi 的最大值
minn = max(minn,p[i].mi);
// // 遍历每个士兵找出所有士兵的 mx 的最大值
maxx = max(maxx,p[i].mx);
}
// 输出最终结果
cout << minn <<' '<<maxx;
return 0;
}