zoukankan      html  css  js  c++  java
  • USACO 4.4 Shuttle Puzzle (新年继续跪)

    nocow上的分析,发现这规律的人实在是太厉害了,bfs或者dfs还没试过,照着这思路写最后还是有点问题,1,2时有点特殊,看了下别人的代码过了

    数据分析

    Usaco在这题上并没有指明不可以用分析法,而且dfs肯定TLE,所以我们取巧。

    先观察样例数据,如果把还没移动的那一步也算上,那么空格的位置为

    4 3 5 6 4 2 1 3 5 7 6 4 2 3 5 4 (n=3,样例)

    5 4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6 5 (n=4)

    我们凭借极其敏锐的眼光发现这组序列为

    435 642 1357 642 35 4 (n=3,样例)

    5 46 753 2468 97531 2468 753 46 5 (n=4)

    即长度为1,2,3,4,...,n,n+1,n,...,4,3,2,1这样的2n+1组等差序列

    我们讨论第1~n+1组序列,这些序列满足

      *公差的绝对值为2

      *奇数组为降序列,偶数组为升序列

      *对于第i组(1<=i<=n+1),若为奇数组则首项为n+i,偶数组则首项为n-i+2

    对于第n+2~2n+1组,可以由对称性求出。

    输出时从第二组开始即可。

    把规律总结成这样后,代码应该很好写了吧

    /*
    
    ID: hubiao cave
    
    PROG: shuttle
    
    LANG: C++
    
    */
    
    
    
    
    #include<iostream>
    
    #include<fstream>
    
    #include<string>
    
    using namespace std;
    
    
    /*数据分析
    Usaco在这题上并没有指明不可以用分析法,而且dfs肯定TLE,所以我们取巧。
    先观察样例数据,如果把还没移动的那一步也算上,那么空格的位置为
    
    4 3 5 6 4 2 1 3 5 7 6 4 2 3 5 4 (n=3,样例)
    
    5 4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6 5 (n=4)
    
    我们凭借极其敏锐的眼光发现这组序列为
    
    435 642 1357 642 35 4 (n=3,样例)
    
    5 46 753 2468 97531 2468 753 46 5 (n=4)
    
    即长度为1,2,3,4,...,n,n+1,n,...,4,3,2,1这样的2n+1组等差序列
    
    我们讨论第1~n+1组序列,这些序列满足
    
      *公差的绝对值为2
    
      *奇数组为降序列,偶数组为升序列
    
      *对于第i组(1<=i<=n+1),若为奇数组则首项为n+i,偶数组则首项为n-i+2
    
    对于第n+2~2n+1组,可以由对称性求出。
    
    输出时从第二组开始即可。
    
    把规律总结成这样后,代码应该很好写了吧*/
    
    int main()
    
    {
    
        int ary[50000]={0};
        ifstream fin("shuttle.in");
    
        ofstream fout("shuttle.out");
        int n,cnt=0;
        fin>>n;
        for(int i=2;i<=n+1;i++)
        {
            if(i%2)
            {
                for(int j=0;j<i;j++)
                {
                    ary[cnt++]=n+i-j*2;
                }
            }
            else
            {
                for(int j=0;j<i;j++)
                {
                    ary[cnt++]=n-i+2+j*2;
                }
            }
        }
    
        for(int i=n;i>=2;i--)
        {
            if(i%2)
            {
                for(int j=0;j<i;j++)
                {
                    ary[cnt++]=n+i-j*2;
                }
            }
            else
            {
                for(int j=0;j<i;j++)
                {
                    ary[cnt++]=n-i+2+j*2;
                }
            }
        }
        
        ary[cnt++]=n+1;
        for(int i=0;i<cnt;i++)
        {
            fout<<ary[i];
            if((i+1)%20==0||i==cnt-1)
                fout<<endl;
            else
                fout<<" ";
        }
        
    
        return 0;
    
    
    }
  • 相关阅读:
    项目开发中需要注意的
    数据库函数
    C#中 ?. 运算符
    字符串格式化String.Format
    day37 进程理论 多进程
    36 网络编程---操作系统 并发
    day35 socket的常用方法,
    day34
    day33天 网络编程udp pycharm控制台输出带颜色
    day32 网络编程初识
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3542217.html
Copyright © 2011-2022 走看看