这是一道很有意思的题目。
我的思路是:
1,最短时间:我将整个独木桥从中间分成两部分,分别从中间向两边循环,找到离中间位置最近的那个士兵,即可确定最短时间。(就是以独木桥的中间为分界线,我们设定两边的士兵都往岸上走,当离岸最远的士兵上岸,所有人就都已经上岸了)
2,最长时间(奇妙的地方来了):题目说两个士兵碰面的时候,两个人都会掉头。我们可以看成他们穿过了彼此然后继续沿着原方向前进(交换灵魂系列),这个画个图比较好理解。
献上AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
int p[10100]={0};
void printmin(int l,int p[])
{
int mid,sum1=0,sum2=0;
if(l%2==0)
{
mid=l/2;
for(int i=mid;i>=1;i--)
{
if(p[i]!=0)
{
sum1=i;break;
}
//else continue;
}
for(int j=mid+1;j<=l;j++)
{
if(p[j]!=0)
{
sum2=l-j+1;break;
}
//else continue;
}
if(sum1>=sum2) printf("%d ",sum1);
else printf("%d ",sum2);
}
else
{
mid=l/2+1;
if(p[mid]!=0)
{
printf("%d ",mid);return ;
}
for(int i=mid-1;i>=1;i++)
{
if(p[i]!=0)
{
sum1=i;break;
}
}
for(int j=mid+1;j<=l;j++)
{
if(p[j]!=0)
{
sum2=l-j+1;break;
}
}
if(sum1>=sum2) printf("%d ",sum1);
else printf("%d ",sum2);
}
return ;
}
void printmax(int l,int p[])
{
int max1=0,max2=0,index=1;
while(1)
{
if(p[index]!=0)
{
max1=l-index+1;break;
}index++;
}
index=l;
while(1)
{
if(p[index]!=0)
{
max2=index;break;
}index--;
}
if(max1>=max2) printf("%d",max1);
else printf("%d",max2);
return ;
}
int main()
{
memset(p,0,sizeof(p));
int l;
scanf("%d",&l);
int n;
scanf("%d",&n);
if(n==0) //特殊判断
{
printf("0 0");return 0;
}
int s;
for(int i=1;i<=n;i++)
{
scanf("%d",&s);
p[s]=1;
}
//int maxtime,mintime;
printmin(l,p);
printmax(l,p);
return 0;
}
还有巨犇(Mr_QwQ)的简化版代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,l,p,maxv=0,minv=0;
scanf("%d%d",&l,&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p);
maxv=max(maxv,max(l-p+1,p));
minv=max(minv,min(l-p+1,p));
}
printf("%d %d",minv,maxv);
return 0;
}