【Luogu P3124】【USACO15OPEN】Trapped in the Haybales S
阿新 • • 發佈:2020-08-13
首先找到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。