首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【HDU】5256 - 序列变换(LIS)

【HDU】5256 - 序列变换(LIS)

作者头像
FishWang
发布2025-08-27 09:14:39
发布2025-08-27 09:14:39
2200
举报

点击打开题目

序列变换

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1268 Accepted Submission(s): 476

Problem Description

我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。 请输出最少需要修改多少个元素。

Input

第一行输入一个 ,表示有多少组数据 每一组数据: 第一行输入一个 ,表示数列的长度 第二行输入N个数 。 每一个数列中的元素都是正整数而且不超过 。

Output

对于每组数据,先输出一行 Case #i: 然后输出最少需要修改多少个元素。

Sample Input

代码语言:javascript
复制
   2
2
1 10
3
2 5 4

Sample Output

代码语言:javascript
复制
   Case #1:
0
Case #2:
1

Source

2015年百度之星程序设计大赛 - 初赛(2)

满足条件的情况为:a [ i ] - a[ j ] >= i - j 移项一下,然后就变成求LIS的问题了。

代码如下:

代码语言:javascript
复制
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int main()
{
	int u;
	int n;
	int a[100000+11];
	int g[100000+11];
	int Case = 1;
	scanf ("%d",&u);
	while (u--)
	{
		scanf ("%d",&n);
		for (int i = 1 ; i <= n ; i++)
			scanf ("%d",&a[i]) , a[i] -= i , g[i] = INF;
		printf ("Case #%d:\n",Case++);
		int pos;
		int ans = 0;
		for (int i = 1 ; i <= n ; i++)
		{
			pos = upper_bound (g+1 , g+1+n , a[i]) - g;
			ans = max (ans , pos);
			g[pos] = min (g[pos] , a[i]);
		}
		printf ("%d\n",n-ans);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 序列变换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档