只有76分啦,求解
给一个正整数数列,每个数都在100万内,最多100万个数,有一个动作叫“插入”,就是把某个数从原来位置拿出来,插到某个新的位置,就像整理扑克牌那样,问给你的这个数列要多少次插入才能非递减地排列好。就输出这个次数。比如5 1 2 3 4,就插入一次即可
[解决办法]
相当于求最长递增子序列,复杂度为O(nlogn)。
[解决办法]
http://blog.csdn.net/bobcowwocb/archive/2009/09/09/4536092.aspx
水平有限,看不懂,悲剧了。
[解决办法]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int f[100001],a[100001],c[100001];
int n,size;
int bsearch(int ai)
{
int l=1,r=size,mid;
while (l <=r)
{//二分查找
mid=(l+r)>>1;
if (ai <c[mid-1] && ai>=c[mid]) return mid;
else if (ai <c[mid]) l=mid+1;
else r=mid-1;
}
}
int main()
{
scanf("%d",&n);
if (!n)
{
printf("0\n");
exit(0);
}
for (int i=1;i <=n;i++) scanf("%d",&a[i]);
f[1]=1;c[1]=a[1];size=1;
for (int i=2;i <=n;i++)
{
if (a[i]==0) continue;
int j;
if (a[i]>=c[1]) j=1;
else if (a[i] <c[size]) j=++size;
else j=bsearch(a[i]);
f[i]=j;c[j]=a[i];
}
printf("%d\n",size);
system("pause");
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bobcowwocb/archive/2009/09/09/4536092.aspx