洛谷p1007 獨木橋
阿新 • • 發佈:2018-11-12
題目連結https://www.luogu.org/problemnew/show/P1007
題目大意:有一座長為L的橋,其座標為1…L,橋上有n個士兵,其座標已知,每個士兵的速度都為1,方向未知。要求所有士兵都離開獨木橋的最短和最長時間。
分析:所有士兵都必須離開橋。思路借鑑《訓練指南》的一道題“螞蟻”,兩隻螞蟻碰撞掉頭繼續走,看上去和對穿而過沒有區別。士兵也一樣,不考慮兩個士兵具體哪個是哪個,兩人相當於一直向原方向走,碰撞可看作一直走但在左的還在左,在右的還在右,全域性可以這樣考慮。對於每個士兵,其最優為向近的端點一直走,最劣為向遠的端點一直走。最短時間即為最靠近橋中間的人走到較近端點的時間,他是最後一個到端點的士兵,最遠時間為最靠近橋端點的人走到另一端的時間,他是最後一個離開橋的士兵。
注意n=0的邊界情況。
ps 一道難度為普及-,程式碼10+行的題都沒有一次性A掉,還是第二天才A掉,看來要恢復到高二時的水平任重而道遠…
o(nlogn)
#include<cstdio>
#include<algorithm>
using namespace std;
int l,n,a[5005];
int minn,maxx;
int main()
{
scanf("%d%d",&l,&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+1+n);
for (int i=1;i<=n;i++)minn=max(minn,min(a[i],l+1-a[i]));
if(n>0)maxx=max(l+1-a[1],a[n]);
printf("%d %d\n",minn,maxx);
return 0;
}
o(n)
#include<cstdio>
#include<algorithm>
using namespace std;
int l,n,a[5005];
int minn,maxx;
int main()
{
scanf("%d%d",&l,&n);
for (int i=1,pos;i<=n;i++){scanf("%d",&pos);a[pos]=1;}
for(int i=1;i<=l;i++)if(a[i]){maxx=l+1-i;break;}
for(int i=l;i>=1;i--)if(a[i]){maxx=max(maxx,i);break;}
for(int i=l/2;i>=1;i--)if(a[i]){minn=i;break;}
for(int i=l/2+1;i<=l;i++)if(a[i]){minn=max(minn,l+1-i);break;}
printf("%d %d\n",minn,maxx);
return 0;
}