• hdu 5256 序列变换 (LIS变形)


    序列变换

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


    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]-i序列的最长LIS;
    a[j]-a[i]>j-i。即是两个元素不改变须要满足两数之差大于下标之差。

    #include <iostream>
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define N 100005
    #define LL __int64
    int a[N];
    int b[N];
    int fun(int n)
    {
        int i,t,cnt=0;
        for(i=0;i<n;i++)
        {
            t=upper_bound(b,b+cnt,a[i])-b;
            //printf("%d 
    ",t);
            if(t==cnt)
                cnt++;
            b[t]=a[i];
        }
        return cnt;
    }
    int main()
    {
        int i,T,n,cnt=1;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                a[i]-=i;
            }
            printf("Case #%d:%d
    ",cnt++,n-fun(n));
        }
        return 0;
    }
    




  • 相关阅读:
    POJ 3114 Tarjan+Dijkstra
    278. First Bad Version
    209. Minimum Size Subarray Sum
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    710. Random Pick with Blacklist
    767. Reorganize String
    524. Longest Word in Dictionary through Deleting
    349. Intersection of Two Arrays
    350. Intersection of Two Arrays II
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5215673.html
Copyright © 2020-2023  润新知