zoukankan      html  css  js  c++  java
  • 2017网易有道— 洗牌、构造队列

    1、[编程题] 洗牌

    洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆)。接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌。接着把牌合并起来就可以了。 例如有6张牌,最开始牌的序列是1,2,3,4,5,6。首先分成两组,左手拿着1,2,3;右手拿着4,5,6。在洗牌过程中按顺序放下了6,3,5,2,4,1。把这六张牌再次合成一组牌之后,我们按照从上往下的顺序看这组牌,就变成了序列1,4,2,5,3,6。 现在给出一个原始牌组,请输出这副牌洗牌k次之后从上往下的序列。

    输入描述:

    第一行一个数T(T ≤ 100),表示数据组数。对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌组从上到下的序列。

    输出描述:

    对于每组数据,输出一行,最终的序列。数字之间用空格隔开,不要在行末输出多余的空格。

    输入例子:

    3

    3 1

    1 2 3 4 5 6

    3 2

    1 2 3 4 5 6

    2 2

    1 1 1 1

    输出例子:

    1 4 2 5 3 6

    1 5 4 3 2 6

    1 1 1 1

    分析:每次洗牌后均是是将序号为1-n的元素依次排在新的序列的奇数位,序列为n+1-2*n的元素依次排在新的序列的偶数位

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include <vector>
    #include<string>
    using namespace std;
    #define MAXN 1000
    
    
    int main()
    {
        int T ;
        cin >> T;
        while (T--)
        {
            int n, k;
            cin >> n >> k;
            vector<int> array(2 * n);
            for (int i = 0; i < n * 2; ++i)
                cin >> array[i];
            
            for (int j = 0; j < k; ++j)
            {
                vector<int> temp(2 * n);
                int count = 0;
                for (int i = 0; i < n; ++i)
                {
                    temp[count++] = array[i];
                    temp[count++] = array[n + i];
    
                }
                array = temp;
            }
            cout << array[0];
            for (int i = 1; i < 2 * n; ++i)
            {
                cout << ' ' << array[i];
            }
            cout << endl;
        }
    
        return 0;
    } 

    2、[编程题]构造队列

    小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序:

    while(!Q.empty())              //队列不空,执行循环

    {

        int x=Q.front();            //取出当前队头的值x

        Q.pop();                 //弹出当前队头

        Q.push(x);               //把x放入队尾

        x = Q.front();              //取出这时候队头的值

        printf("%d ",x);          //输出x

        Q.pop();                 //弹出这时候的队头

    }

    做取出队头的值操作的时候,并不弹出当前队头。
    小明同学发现,这段程序恰好按顺序输出了1,2,3,...,n。现在小明想让你构造出原始的队列,你能做到吗?[注:原题样例第三行5有错,应该为3,以下已修正]

    输入描述:

    第一行一个整数T(T ≤ 100)表示数据组数,每组数据输入一个数n(1 ≤ n ≤ 100000),输入的所有n之和不超过200000。

    输出描述:

    对于每组数据,输出一行,表示原始的队列。数字之间用一个空格隔开,不要在行末输出多余的空格.

    输入例子:

    4

    1

    2

    3

    10

    输出例子:

    1

    2 1

    2 1 3

    8 1 6 2 10 3 7 4 9 5

      首先在队列中依次加入1,2,...n,代表题目描述中A序列的下标,然后模拟题目描述的过程,可以知道第1个会输出2,这就代表着B序列中下标1的元素恰好是A序列中下标2的元素,而我们知道B序列下标1的元素就是“1”,也就是说A序列中下标2的元素是“1”,另开辟一个数组,在数组第2位存下1,再继续模拟,重复以上过程,则这个数组中的元素顺序就是答案要的

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include <vector>
    #include<queue>
    #include<string>
    using namespace std;
    #define MAXN 1000
    
    
    int main()
    {
        int t;
        cin >>t;
        while (t--)
        {
            int n; 
            cin >> n;
            vector<int> res(n);
            queue<int> Q;
            for (int i = 0; i < n; ++i)
                Q.push(i);
            int i = 1;
            while (!Q.empty())
            {
                int x = Q.front();
                Q.pop();
                Q.push(x);
                x = Q.front();
                res[x] = i++;
                Q.pop();
    
            }
            cout << res[0];
            for (int i = 1; i < n; ++i)
                cout << ' ' << res[i];
            cout << endl;
    
        }
    
        return 0;
    }
  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/eilearn/p/9441961.html
Copyright © 2011-2022 走看看