【洛谷】P1007 独木桥

题目链接

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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值