百度之星 2015 初赛(2) 1005 序列变换
2015-05-31 19:10
253 查看
序列变换
Accepts: 695Submissions: 3322
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description
我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。 请输出最少需要修改多少个元素。
Input
第一行输入一个T(1≤T≤10),表示有多少组数据
每一组数据:
第一行输入一个N(1≤N≤105),表示数列的长度
第二行输入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
解题思路:
最长非严格单调递增子序列。
#include <stdio.h> int GetPosition(int c[], int len, int i, int X[]) { int start = 1; int end = len; while (start <= end) { int mid = (start + end) / 2; if (X[c[mid]] <= X[i]) { start = mid + 1; } else { end = mid - 1; } } return start; } int LongestIncreasingSubsequence(int X[], int n) { int c , path ; c[0] = -1; c[1] = 0; int line ; line[0] = c[0]; int len = 1; for (int i = 1; i < n; ++i) { int index = GetPosition(c, len, i, X); line[i] = c[index - 1]; c[index] = i; if (index > len) { len = index; } } path[0] = c[len]; int i = 0; while (line[path[i]] != -1) { path[i + 1] = line[path[i]]; ++i; } return len; } int main() { int T,i,j,it; scanf("%d", &T); for(i = 1; i <= T; i++) { int N; scanf("%d", &N); int a ; for(j = 0; j < N; j++) {scanf("%d", a+j);a[j]-=j;}; int r = LongestIncreasingSubsequence(a, N); printf("Case #%d:\n",i); printf("%d\n", N - r); } return 0; }
相关文章推荐
- poj-1947 Rebuilding Roads
- 加密简单原理
- Tip:如果AD用户被删除了,exchange邮箱还存不存在
- 提交spark应用程序spark-submit
- linux下stc89c52及其他国产芯片烧写方案
- ajax_基础
- linux下安装oracle11g详解
- Java NIO 02=====Channel
- 团队飞机大战分配任务——制定软件测试计划
- 将正整数N转换成m(2-16)进制数
- php利用接口实现类的多重继承
- 关于中国产品的质量问题-一个暖水袋引发的思考
- 百度之星 2015 初赛(2) 1003 棋盘占领
- js-定时任务setInterval,setTimeout,clearInterval,clearTimeout
- (转)CSS字体大小: em与px、pt、百分比之间的对比
- 第七课,分支结构程序体验|三个整数输出最大值
- qq聊天机器人 群发工具 (java版) (二)
- MooTools
- 启动Eclipse 弹出Failed to load the JNI shared library 的解决方法
- 四大域总结