bnuoj49098 神奇的身高

来源:互联网 发布:知乎pc客户端 编辑:程序博客网 时间:2024/06/11 23:44

有一群小伙伴站成一行,每个人的身高都是非负整数,但是他们站在一起并不和谐。需要将他们的身高变成严格单调递增的正整数序列才是和谐的。现在你有一种神奇的魔法,可以任意改变一个人的身高。现在问题来了,你最少需要改变多少人的身高才能使整个队伍和谐。(改变后的身高必须为整数)



这道题就是hdu5256的加强版。
http://blog.csdn.net/mymilkbottles/article/details/72235416
直接用hdu5256的套路是不行的。
因为这道题要求 需要将他们的身高变成严格单调递增的正整数序列才是和谐的。
比如

79 17 1 2 3 4 5

这组,使用hdu5652的程序得出的答案是2,因为只需要变成-1 -2 1 2 3 4 5就行了。
这道题是不能变成负数的,所以我们只能改变后边的5个数。

所以我们对b[i] (上面的链接题解中的)中负数去掉即可。
因为这些数都已经小于最理想的序列了,那么再怎么样都是要变化的。

#include<iostream>using namespace std;#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<stdlib.h>#include<vector>#include<queue>#include<deque>#include<map>#include<set>#include<time.h>#define pi(x,y) printf("%d%c",(x),(y));#define pin(x) printf("%d\n",(x));#define si(x) scanf("%d",&(x))#define sii(x,y) scanf("%d%d",&(x),&(y))#define s3(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))#define rep(x,y,z) for(int (x)=(y);(x)<(z);++(x))#define dep(x,y,z) for(int (x)=(y)-1;(x)>=(z);--(x))#define read int TcaseN;scanf("%d",&TcaseN);for(int Tcase=1;Tcase<=TcaseN;++Tcase)#define cls(x,y) memset((x),(y),sizeof((x)));#define pb(x) push_back(x)#define mp(x,y) make_pair((x),(y))#define max3(value_a,value_b,value_c) max(max(value_a,value_b),value_c)#define min3(value_a,value_b,value_c) min(min(value_a,value_b),value_c)#define GT(x) (x)=clock();#define fin(x) freopen(x,"r",stdin);#define fout(x) freopen(x,"w",stdout);///In This You Can Define Long Integer Type#define LONGTYPE long longtypedef LONGTYPE LL;typedef unsigned LONGTYPE ULL;const int maxint=((~((unsigned)(0)))>>1);const LL maxll=((~((unsigned LONGTYPE)(0)))>>1);const int inf=0x3f3f3f3f;const double PI=acos(-1.0);const int N=100005;int a[N],b[N],dp[N],n;/**51 5 3 2 481 6 3 8 9 17 12 3171 2 3 5 5 5 661 3 9 5 6 779 17 0 1 2 3 455 5 5 5 5*/int LIS(){    int len=0;    for(int i=1;i<=n;++i){        if(b[i]<0)continue;        int pos=upper_bound(dp,dp+n,b[i])-dp;        dp[pos]=b[i];        len=max(len,pos+1);    }    return n-len;}int main() {#ifdef tangge    clock_t tSTART,tEND,t3;    GT(tSTART);#endif // tangge    /*Input:*/    while(scanf("%d",&n)==1){        dp[0]=inf;        for(int i=1;i<=n;++i)scanf("%d",&a[i]),b[i]=a[i]-i,dp[i]=inf;        printf("%d\n",LIS());    }#ifdef tangge    GT(tEND);    printf("%.8lf\n",(tEND-tSTART)/1000.0);#endif // tangge    return 0;}
原创粉丝点击