zoukankan      html  css  js  c++  java
  • 一类有关序列的技巧问题



    问题一:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=601&pid=1005

    我们有一个数列A1,A2...An,你如今要求改动数量最少的元素,使得这个数列严格递增。当中不管是改动前还是改动后。每一个元素都必须是整数。

    请输出最少须要改动多少个元素。


    选取最长的符合要求的序列,然后把其它值改变就可以。怎样找到符合要求的序列?由于要递增,所以每一个数和它自身所在的位置有关,也就是自身占领了位置的权重,所以每一个数减去相应的位置的权即a[i]-i,还原出主要矛盾,然后取一条非降LIS就可以

        int T;
        scanf("%d",&T);
        for(int cas=1;cas<=T;cas++)
        {
            scanf("%d",&n);
            int LIS;
            for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]-=i;
            for(int i=1;i<=n;i++) dp[i]= inf;
            for(int i=1;i<=n;i++) *upper_bound(dp+1,dp+n+1,a[i])=a[i];
            for(int i=1;i<=n;i++) if(dp[i]!=inf) LIS=i;
            printf("Case #%d:
    %d
    ",cas,n-LIS);
        }

    问题二:http://codeforces.com/contest/549/problem/G

    已知一个序列。问能否够经过相邻两个数的调换得到非降的序列,调换的代价是AiAj换成AjAi后。Aj增大1,Ai降低了1.

    思路:仍然能够发现每一个数相应不同位置自身带有不同的权(潜在价值),所以每一个数a[i]+i后,是他们的总价值。sort后他们若严格递增再减去潜在价值后的序列一定非降,然后输出答案,否则无法调换完毕。

    int main()
    {
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i],a[i]+=i;
        sort(a,a+n);
        for(int i=0;i<n;i++) a[i]-=i;
        for(int i=0;i<n-1;i++) if(a[i]>a[i+1]){
            puts(":(");
            exit(0);
        }
        for(int i=0;i<n;i++) printf("%d ",a[i]);
    }


    问题三:(忘记题源了)

    x轴有n个点,分别相应坐标xi。问最少要把点累计移动多长的距离才干使他们成为间隔L的整齐排列。

    思路:显然每一个点相应相应的潜在价值。每一个点的坐标Xi减L*i。即还原了主要矛盾。如今把这些新的点均移到某个同一点就可以。

    显然移到他们的中位点产生的累计移动距离最小。


  • 相关阅读:
    StringTable
    TCP网络协议
    也说JVM内存区域
    JVM类加载
    java中的引用:强、软、弱、虚
    AQS
    vscode支持unicode编码
    设计模式简记-快速改善代码质量的编程规范
    擅事利器
    设计模式简记-通过重构增强代码可测试性实战
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6748421.html
Copyright © 2011-2022 走看看