洛谷P1007 独木桥【模拟解法】


前言

这题主要考查模拟,主要是想一想花费时间最大和最小的情况,同时考虑一下要怎么得到a和b碰在一起时,怎么去便捷地得到a和b花费的时间。

看完提示的同学可以先再想一想如何解出这道题


一、题目

洛谷P1007 独木桥

在这里插入图片描述


二、解题过程

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;
}

如果觉得对你有所帮助的话,请点个免费的赞吧!

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值