1. 程式人生 > >洛谷p1007 獨木橋

洛谷p1007 獨木橋

題目連結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; }