AcWing.1659 社交距離 I
阿新 • • 發佈:2022-03-23
題目連結
題目思路
最開始想暴力,沒暴出來。之後看了大佬的二分題解豁然開朗
因為是找最近距離的最大值,所以先找到最小的距離作為右邊界
l, r表示待放奶牛的位置與上一奶牛的位置差
check函式的p作為當前奶牛位置,初始化為1 - x是因為區間是[1, n],要保證在p+x位置插入奶牛,如果
初始化為1的話區間就改變了。
check函式遍歷每塊區間是否可以插入奶牛,傳入的x為待插入的奶牛到上一頭奶牛的距離,當可插入的數量>=2時即為可以插入。
二分則是為了尋找最大距離,當可以放得下時增大距離,放不下時縮小距離。
題目程式碼
#include <iostream> #include <algorithm> using namespace std; const int N = 100010; int n, m; int a[N]; char s[N]; bool check(int x) { int p = 1 - x, cnt = 0; for(int i = 1; i <= m; i ++ ) { while(p + x + x <= a[i]) { p += x; cnt ++ ; } p = a[i]; } while(p + x <= n) p += x, cnt ++ ; return cnt >= 2; } int main() { cin >> n; cin >> s + 1; for(int i = 1; i <= n; i ++ ) if(s[i] == '1') a[++ m] = i; int l = 1, r = n; for(int i = 1; i < m; i ++ ) r = min(r, a[i + 1] - a[i]); int ans = 0; while(l <= r) { int mid = l + r >> 1; if(check(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans << endl; return 0; }