51nod 1294 :修改数组 && HDU 5256:序列变换

题目来源: HackerRank
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
 收藏
 取消关注
给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数。问最少需要修改几个数?
Input
第1行:一个数N表示序列的长度(1 <= N <= 100000)。
第2 - N + 1行:每行1个数,对应数组元素。(0 <= A[i] <= 10^9)
Output
输出最少需要修改几个数使得整个数组是严格递增的。
Input示例
5
1
2
2
3
4
Output示例
3


发现规律就是如果该位置的数a[i]-i,这个数如果小于零了,那么这个数是一定要修改的。
剩下的那些a[i]-i就是要找最长的非严格递增序列了。
代码:
#include <iostream>  
#include <algorithm>  
#include <cmath>  
#include <vector>  
#include <string>  
#include <cstring>  
#pragma warning(disable:4996)  
using namespace std;

int n;
int val[100005];
int f[100005];
int soar[100005];

int main()
{
	//freopen("i.txt", "r", stdin);
	//freopen("o.txt", "w", stdout);

	int i, k, num, ans;
	scanf("%d", &n);

	num = 0;
	ans = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &val[i]);
		val[i] = val[i] - (i + 1);

		if (val[i] < 0)
		{
			ans++;
		}
		else
		{
			f[num++] = val[i];
		}
	}
	
	fill(soar,soar+num,-1);
	k = 0;
	
	for (i = 0; i < num; i++)
	{
		if (f[i] >= soar[k])
		{
			soar[++k] = f[i];
		}
		else
		{
			int pos = upper_bound(soar, soar + k + 1, f[i]) - soar;
			soar[pos] = f[i];
		}
	}
	printf("%d
", num - k + ans);
	//system("pause");
	return 0;
}

序列变换

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


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

Input
第一行输入一个T(1T10),表示有多少组数据

每一组数据:

第一行输入一个N(1N105),表示数列的长度

第二行输入N个数A1,A2,...,An

每一个数列中的元素都是正整数而且不超过106
 

Output
对于每组数据,先输出一行

Case #i:

然后输出最少需要修改多少个元素。
 

Sample Input
2 2 1 10 3 2 5 4
 

Sample Output
Case #1: 0 Case #2: 1
 

和之前的没什么区别,把大于0的条件删掉就OK。
代码:
#include <iostream>  
#include <algorithm>  
#include <cmath>  
#include <vector>  
#include <string>  
#include <cstring>  
#pragma warning(disable:4996)  
using namespace std;

int n;
int val[100005];
int f[100005];
int soar[100005];

int main()
{
	//freopen("i.txt", "r", stdin);
	//freopen("o.txt", "w", stdout);

	int i, k, num;
	
	int test, cas = 1;
	scanf("%d", &test);
	while (test--)
	{
		scanf("%d", &n);

		num = 0;
		for (i = 0; i < n; i++)
		{
			scanf("%d", &val[i]);
			val[i] = val[i] - (i + 1);
			f[num++] = val[i];		
		}

		fill(soar, soar + num, -1000005);
		k = 0;

		for (i = 0; i < num; i++)
		{
			if (f[i] >= soar[k])
			{
				soar[++k] = f[i];
			}
			else
			{
				int pos = upper_bound(soar, soar + k + 1, f[i]) - soar;
				soar[pos] = f[i];
			}
		}
		printf("Case #%d:
", cas++);
		printf("%d
", num - k);
	}
	//system("pause");
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899521.html