码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 5256 序列变换

时间:2015-06-03 10:03:00      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

题意:一个数列,a1,a2,a3,a4,---,an,需要最少修改多少个元素,使得这个序列严格递增?

分析:因为a[i]<a[i+1],且a[i],a[i+1]都是整数,所以有a[i+1]-1>=a[i],整理得a[i+1]-(i+1)>=a[i]-i。令b[i]=a[i]-i。则可以求出b[i]的最长不下降子序列的长度len,最后用n-len即为需要改变的最少的元素个数。

#include<iostream>
#include<algorithm>
using namespace std;

int a[100005];
int f[100005];

int get_len(int n)
{
	int len,i,pos;

	len=1;
	f[1]=a[1];
	for(i=2;i<=n;i++)
		if(a[i]>=f[len])
			f[++len]=a[i];
		else    //upper_bound返回的是序列中严格大于key值的第一个数
		{
			pos=upper_bound(f+1,f+len+1,a[i])-f;
			f[pos]=a[i];
		}
	return len;
}

int main()      
{
	int T,t,n,i;

	scanf("%d",&T);
	t=0;
	while(T--)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			a[i]-=i;
		}
		printf("Case #%d:\n",++t);
		printf("%d\n",n-get_len(n));
	}
    return 0;      
}



HDU ACM 5256 序列变换

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46336299

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!