UVa12321 Gas Station
解法
ソートして、O(N) 程度の貪欲。
反省
入力で [ max(0, X-R), min(L, X+R) ] と端を切る処理が抜けていたためずっとTLEしてた。
int L, G; int solve(vector<pair<int, int>>& vec) { int l = 0, r = 0; int idx = 0; int cnt = 0; while(1) { while(1) { if(G <= idx || l < vec[idx].first) break; r = max(r, vec[idx].second); idx++; } l = r; cnt ++; if( r >= L ) break; if(idx >= G) break; } if( r < L ) return -1; return cnt; } int main() { while(cin >> L >> G && (L|G) ) { vector<pair<int, int>> vec; for(int i=0; i<G; i++) { int X, R; cin >> X >> R; vec.push_back(make_pair(max(0, X-R), min(X+R, L))); } sort(vec.begin(), vec.end()); if(vec[0].first > 0) { cout << -1 << endl; continue; } int res = solve(vec); if(res == -1) cout << -1 << endl; else cout << G-res << endl; } return 0; }