题目链接:
http://www.bnuoj.com/v3/problem_show.php?pid=49098
分析:
第i个人的身高肯定大于等于i,因此我们将不满足这个条件的人的肯定需要改变,人数为S1;
然后将满足这个条件的人的身高记录下来,然后这些人的身高也需要满足单调递增。
因此我们可以求出他们的LIS,长度为S2.
ans = S1 + n - S2;
代码如下:
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int maxn = 1e5+10; int a[maxn]; int b[maxn]; int dp[maxn]; int main() { int n; while(~scanf("%d",&n)){ int num=0,ans=0,tot=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); a[i]-=i; if(a[i]<1){ ans++; } else{ b[tot++]=a[i]; } } int dnum=0; for(int i=0;i<tot;i++){ int pos = upper_bound(dp,dp+dnum,b[i])-dp; if(pos==dnum) dp[dnum++]=b[i]; else dp[pos]=b[i]; } ans=ans+tot-dnum; printf("%d\n",ans); } return 0; }
时间: 2024-10-15 00:40:38