1. 程式人生 > 實用技巧 >【Luogu P3124】【USACO15OPEN】Trapped in the Haybales S

【Luogu P3124】【USACO15OPEN】Trapped in the Haybales S

首先找到Bessie位於哪兩個乾草堆之間,模擬Bessie跳的過程。兩遍模擬,統計Bessie左、右乾草堆墊高的高度。比如Bessie左邊的乾草堆需要墊高,她就要儘量向右跳,跳到右邊無法跨越的位置為止。

如果當前左右兩個乾草堆Bessie都跳不出去,則無需墊高幹草堆,輸出0。

核心程式碼:

 1 for(i=1;i<=n;++i) if (a[i].p>b) break;
 2 l=i-1,r=i;d=a[r].p-a[l].p;
 3 while(l>0&&r<=n)
 4 {
 5     if (a[l].s>=d&&a[r].s>=d)
6 {puts("0");return 0;} 7 if (a[r].s<d) 8 { 9 ++r; 10 d=a[r].p-a[l].p; 11 continue; 12 } 13 if (a[l].s<d) 14 { 15 ans=min(ans,d-a[l].s); 16 --l; 17 d=a[r].p-a[l].p; 18 } 19 } 20 l=i-1,r=i;d=a[r].p-a[l].p; 21 while(l>0
&&r<=n) 22 { 23 if (a[l].s>=d&&a[r].s>=d) 24 {puts("0");return 0;} 25 if (a[l].s<d) 26 { 27 --l; 28 d=a[r].p-a[l].p; 29 continue; 30 } 31 if (a[r].s<d) 32 { 33 ans=min(ans,d-a[r].s); 34 ++r; 35 d=a[r].p-a[l].p;
36 } 37 }

注意當前統計答案的是Bessie左邊的乾草堆,要把判斷右邊乾草堆是否能跳過的語句寫在判斷左邊乾草堆的前面,同時,在處理右邊的語句結尾加上continue,保證跳到不能再跳。如果一直continue到出界,則無論這邊如何加固,另一邊還是可以跳出去,沒有統計答案,ans仍為無窮大,最後輸出-1。