首先直接看題:
?這題直接貪心其實問題不大:
下面先展示我的一個錯誤代碼:
# include<iostream>
# include<vector>
# include<algorithm>using namespace std;int main()
{int N,M;cin>>N>>M;vector<vector<int>> arr(N,vector<int>(2));for(int i=0;i<N;i++){cin>>arr[i][0]>>arr[i][1];}// 感覺貪心應該就能解決int distance = 0;int step = 0;int i = 0;// 可能少考慮了一點while(distance<=M){if(distance<=arr[i][0]){step+=arr[i][0]-distance;distance = arr[i][0]+arr[i][1];}else if(distance>arr[i][0]){i++;if(i>=N){step+=M-distance;break;}}}cout<<step<<endl;return 0;
}
其實整體思路是沒有問題的,
但題目里面有一個細節,就是說“每個跳板能夠將胡同學發射到一定距離內的任意位置。“
這時候問題就來了,比如距離起點為5,能跳長度為6的這樣一個板,它在5-11之間還是會有其他的跳板,所以,在5-11他也不需要自行走路,因為他目前的跳板可以把他送到5-11范圍內的任意位置,那么如果有這樣一個跳板,距離起點7,跳板長度是10,那么借助這個跳板就可以直接達到17這個位置,這是之前代碼沒有考慮到的,之前的代碼直接是認為做上5跳板,到達的位置就是11,這就是問題所在,所以i++的過程中需要進行一個判斷。
所以最終代碼就是:
# include<iostream>
# include<vector>
# include<algorithm>using namespace std;int main()
{int N,M;cin>>N>>M;vector<vector<int>> arr(N,vector<int>(2));for(int i=0;i<N;i++){cin>>arr[i][0]>>arr[i][1];}// 感覺貪心應該就能解決int distance = 0;int step = 0;int i = 0;// 可能少考慮了一點int current_pos = 0;while(distance<M&&i<N){if(current_pos<=arr[i][0]){step+=arr[i][0]-distance;current_pos = arr[i][0];}distance = arr[i][0]+arr[i][1]; // 前一個跳板能達到的最遠距離if(distance>current_pos){current_pos = distance;}i++;}if(current_pos<M){step+=M-current_pos;}cout<<step<<endl;return 0;
}
最主要的點就是一個比較。