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

来源:互联网 发布:怎么找淘宝小二电话 编辑:程序博客网 时间:2024/05/29 15:53

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

Sample Output
Case #1:0Case #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:\n", cas++);printf("%d\n", num - k);}//system("pause");return 0;}



0 0
原创粉丝点击