从又往左点灯塔,点亮一个的同时,往左di范围内的灯塔全部被破坏。现在能在最右端按一个灯塔,攻击范围任意,问到最后最少有几个灯塔留下
用dp瞎搞。具体看代码吧
#include"cstdio" #include"queue" #include"cmath" #include"stack" #include"iostream" #include"algorithm" #include"cstring" #include"queue" #include"vector" #define ll long long using namespace std; const int MAXN = 1e6; const int MAXE = 200500; const int INF = 0x3f3f3f; struct node{ int a,b; }x[MAXN]; int sum[MAXN]; int dp[MAXN*10]; bool cmp(node x,node y){ return x.a<y.a; } int main(){ int n;scanf("%d",&n); int maxv=-1; for(int i=0;i<n;i++) { scanf("%d%d",&x[i].a,&x[i].b); maxv=max(maxv,x[i].a); } if(n==1){ printf("0\n"); return 0; } sort(x,x+n,cmp); dp[x[0].a]=1; for(int i=x[0].a+1,j=1;i<=maxv;i++){ if(i>=x[j].a){ int t=x[j].a-x[j].b-1; if(t>=0)dp[i]=dp[t]+1; else dp[i]=1; j++; } else dp[i]=dp[i-1]; } int ans=INF; for(int i=x[0].a;i<=maxv;i++) ans=min(ans,n-dp[i]); //cout<<i<<‘\t‘<<dp[i]<<endl; printf("%d\n",ans); return 0; }
时间: 2024-10-08 10:34:25