zoukankan      html  css  js  c++  java
  • 【杭电】[5256]序列变换

    序列变换

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


    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


    考虑序列限制条件为a[i]-a[j]>=i-j

    a[i]-i>=a[j]-j

    所以考虑建数组b[i]=a[i]-i

    则问题转换为求数组b[i]的不递减序列的长度l

    则最后结果为n-l


    #include <stdio.h>
    int inf=99999999;
    int n,l;
    int a[100200];
    int s[100200];
    int find(int m) {
    	int la=0,lb=l;
    	while(lb>=la) {
    		int mid=(la+lb)>>1;
    		if(s[mid]>m)
    			lb=mid-1;
    		else
    			la=mid+1;
    	}
    	return la;
    }
    int main() {
    	int T,kase=0;
    	scanf("%d",&T);
    	while(T--) {
    		scanf("%d",&n);
    		for(int i=1; i<=n; i++) {
    			int t;
    			scanf("%d",&t);
    			a[i]=t-i;
    		}
    		s[0]=-inf;
    		l=1;
    		for(int i=1; i<=n; i++) {
    			s[l]=inf;
    			int t=find(a[i]);
    			if(t==l)
    				l++;
    			s[t]=a[i];
    		}
    		printf("Case #%d:
    ",++kase);
    		printf("%d
    ",n-l+1);
    	}
    	return 0;
    }
    

    题目地址:【杭电】[5256]序列变换

  • 相关阅读:
    转:用十条命令在一分钟内检查Linux服务器性能
    android适配的努力
    转: Android Studio你不知道的调试技巧
    编码处理过滤器
    PageBean分页组件
    BaseServlet方法分发
    SQLHelper、DBUtil终极封装
    JavaEE面试题库
    Servlet、JSP选择题(2)
    Servlet、JSP选择题
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569415.html
Copyright © 2011-2022 走看看