有一群小伙伴站成一行,每个人的身高都是非负整数,但是他们站在一起并不和谐。需要将他们的身高变成严格单调递增的正整数序列才是和谐的。现在你有一种神奇的魔法,可以任意改变一个人的身高。现在问题来了,你最少需要改变多少人的身高才能使整个队伍和谐。(改变后的身高必须为整数)
Input
有多组测试数据,保证大数据不超过15组。
每组测试数据:
第1行:一个数n表示人数(1≤n≤100000)
第2~n+1行:每行1个数,对应数组的元素(0≤A[i]≤10^9)
以EOF结束
Output
输出最少需要修改几人的身高才能使整个队伍和谐。
Sample Input
2 1 2 2 2 1
Sample Output
0 1
Source
Author
zpk
思路:根据该位数字与下标的差值求最长非递减序列的长度
#include <iostream> #include <stdio.h> #include <string.h> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <math.h> #include <algorithm> using namespace std; #define ls 2*i #define rs 2*i+1 #define up(i,x,y) for(i=x;i<=y;i++) #define down(i,x,y) for(i=x;i>=y;i--) #define mem(a,x) memset(a,x,sizeof(a)) #define w(a) while(a) #define LL long long const double pi = acos(-1.0); #define N 100005 #define mod 19999997 const int INF = 0x3f3f3f3f; #define exp 1e-8 int n,b[N],ans; int main() { int i,j,k,x; w(~scanf("%d",&n)) { ans = 0; up(i,0,n) b[i]=INF; up(i,1,n) { scanf("%d",&x); if(x-i+1<=0) continue; k = upper_bound(b+1,b+1+n,x-i)-b; b[k]=x-i; ans = max(ans,k); } printf("%d\n",n-ans); } return 0; }
时间: 2024-10-11 04:20:55