• 中山大学校队选拔赛第二试题试题3【Compressed suffix array】-------2015年2月8日


    一:题目大意

    本题通过给定三个数组S0,P,S,其中S0是1到2n的一个排列,P具有2n个整数,且满足:

    数组S是把数组S0中所有奇数元素全部删除并将所有偶数元素除以2并按照原来的相对顺序进行排列而得。

    现在给定数组S和数组P,我们需要反求数组S0。

    二:题目分析

    我们通过对数组P的递推式分析可知:当数组S0的元素是偶数时,这个元素所对应的Pi的值一定等于i.当数组S0的元素为奇数时,我们可以知道对应的Pi一定不等于i。那么我们可以先对数组P扫一遍,把存在Pi=i的元素全部填好,然后再对数组P重新扫描一遍,把所有奇数位置的元素通过如下公式求得并填好:

             

    最后就是对数组进行输出了。over~

    三:AC代码

    #include<iostream>
    using namespace std;
    int ans[1<<14],s[1<<14],p[1<<14];
    int main()
    {
        int n;
        while(cin>>n)
        {
           for(int i=0;i<n;i++)
                cin>>p[i];
           for(int i=0;i<n/2;i++)
            cin>>s[i];
            int k=0;
           for(int i=0;i<n;i++)
           {
               if(p[i]==i+1)
               {
                   ans[i]=s[k++]*2;
               }
           }
           for(int i=0;i<n;i++)
           {
               if(p[i]!=i+1)
               {
                   ans[i]=ans[p[i]-1]-1;
               }
           }
           int i;
           for( i=0;i<n-1;i++)
            cout<<ans[i]<<' ';
           cout<<ans[i]<<endl;
        }
        return 0;
    }

    四:总结

    本题就是逆向思维的运用,以及对找到数组之间的规律的综合体现。

  • 相关阅读:
    IPV6地址中的%号什么意思
    比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?
    Linux 查看本机串口方法
    非对称加密与GPG/PGP
    bootstrap下拉三角
    bootstrap文本背景色
    bootstrap文本颜色
    bootstrap栅格系统响应式
    软件测试(一) 软件测试的阶段划分
    YoTube 视频如何下载
  • 原文地址:https://www.cnblogs.com/khbcsu/p/4280166.html
Copyright © 2020-2023  润新知