题解 P1007 【独木桥】

重要思路:

这道题目如果有两个人相遇,那么其实由于两个人相遇后转身的时间并不会对答案做出贡献,所以其实就可以把两个人相遇后不是看成转身而是看成穿过对方(有点诡异)

之后就是一个简单问题

一个士兵如果要下桥,由于我们现在有了一个士兵与士兵相遇掉头等于不掉头的设定,我们可以得到第i个士兵的下桥最小时间与其位置x(i)的关系为

\[ min(x_i,l+1-x_i) \]

下桥最大时间为

\[ max(x_i,l+1-x_i) \]

由于我们要让所有的士兵都要下桥,所以我们的总下桥时间就是所有士兵中下桥时间的最大值,所以我们最后把每个士兵的下桥时间最小值扫一遍,找到其中的最大值,就是所有士兵的下桥最短时间,我们在扫一遍所有士兵下桥时间的最大值,这其中的最大值就是所有士兵下桥时的最大值

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 5005;

int l; //桥的长度
int n; //士兵的数量 
int arr[N];
int ans1[N],ans2[N];

int main(){
    
    scanf ("%d%d",&l,&n);
    for (int i=1;i<=n;i++) scanf ("%d",&arr[i]);
    
    if (n==0){
        printf ("0 0\n");
        return 0;
    }
    
    for (int i=1;i<=n;i++){
        ans1[i]=min(arr[i],l+1-arr[i]);
        ans2[i]=max(arr[i],l+1-arr[i]);
    }
    
    int maxx=-99999999,minx=-99999999;
    for (int i=1;i<=n;i++){
        minx=max(ans1[i],minx);
        maxx=max(ans2[i],maxx); 
    }
    
    printf ("%d %d\n",minx,maxx);
    
    return 0;

} 

猜你喜欢

转载自www.cnblogs.com/lixiao189/p/9300996.html