题解:可以发现只能拆后面的炮台,dp[i]代表i后面的炮台被拆除留下的炮台个数,二分找第一个摧毁不到的位置
#include <bits/stdc++.h> using namespace std; struct node{ int a,b; }m[100100]; int dp[100100]; int cmp(node c,node d){ return c.a<d.a; } int main() { int n, mid, ans=-1; cin>>n; for(int i=0;i<n;i++) cin>>m[i].a>>m[i].b; sort(m ,m+n, cmp); for(int i=0;i<n;i++){ int l = -1,r = n; while(l+1<r){ mid = (l+r)>>1; if(m[i].a-m[i].b > m[mid].a) l = mid; else r = mid; } if(l == -1) dp[i] = 1; else dp[i] = dp[l]+1; ans = max(ans, dp[i]); } cout<<n-ans<<endl; return 0; }