前言
这题主要考查模拟,主要是想一想花费时间最大和最小的情况,同时考虑一下要怎么得到a和b碰在一起时,怎么去便捷地得到a和b花费的时间。
看完提示的同学可以先再想一想如何解出这道题
一、题目
二、解题过程
1.证明过程
(1)最小时间:即为所有士兵分别向左右方向走两个方向取的最小时间中的最大值。因为必须最小时间必须保证每名士兵都走了,所以必须是每个士兵最小时间的最大值。
(2)最大时间:即为最左边和最右边两个士兵分别向对方走,两人都走出去所用的时间,假设桥L为8,N为4,a在最左,坐标为2,b在最右,坐标为8。
所以最大时间为max(L+1-a[1],a[4])。
2.代码
#include<bits/stdc++.h>
using namespace std;
#define li inline
#define gc getchar
#define pc putchar
#define wr(n) write(n,false),pc('\n')
#define rep(a,b,c) for(ri a=b;a<=c;++a)
#define loop(n) for(int i=0;i<n;++i)
#define loops(n) for(int i=0;i<=n;++i)
#define LL long long
#define int LL
const int N=5e3+10;
//快读模板
int read(){
int x=0,f=0;
char ch=gc();
while('0'>ch||ch>'9')f|=ch=='-',ch=gc();
while('0'<=ch&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=gc();
return f?-x:x;
}
//快写模板
void write(int x){
if(x<0)pc('-'),x=-x;
if(x>9)write(x/10);
pc(x%10+'0');
return;
}
int a[N];
signed main(){
int l,n;
cin>>l>>n;
// 当士兵个数为零时,最大时间和最小时间都是0
if(!n){
cout<<0<<' '<<0<<'\n';
return 0;
}
for(int i=1;i<=n;++i){
a[i]=read();
}
// 对士兵的坐标进行排序,方便求最大时间
sort(a+1,a+n+1);
int maxN=0,minN=0;
for(int i=1;i<=n;++i){
// 单个士兵的最小时间即为士兵i到左边界和右边界的距离的最小值
// 总体士兵的最小时间即为所有士兵的最小时间的最大值
minN=max(minN,min(a[i],l+1-a[i]));
}
// 总体士兵的最大时间即为最左边和最右边的士兵分别向对方的方向走,两人都走出去所用的最大时间
maxN=max(l+1-a[1],a[n]);
cout<<minN<<' '<<maxN<<'\n';
return 0;
}
如果觉得对你有所帮助的话,请点个免费的赞吧!