【日常刷题】洗牌_牛客网WY24

问题描述

【日常刷题】洗牌_牛客网WY24_第1张图片
【日常刷题】洗牌_牛客网WY24_第2张图片

问题分析

这道题其实洗牌不是难的,难的是怎么输入,一开始我没有看到第一个是n第二个是k,导致想了很久该怎么判断每组牌的开头结尾,但是仔细一看题目,发现第一个输入的其实就是n,只需要往后遍历2n个数据即可,然后进行洗牌。
关于洗牌:就是很简单的将牌分成两组,一组是right一组是left,然后创建一个临时牌组ret,每洗一次牌,就将right和left的牌一次插入到ret中,之后将ret逆置(题目要求,是需要从上向下看),之后周而复始,直到洗牌次数为0

代码编写

#include 
#include 
#include 
#include 
using namespace std;

bool HasSpace(string& str) {
    for (auto e : str) {
        if (e == ' ') return true;
    }
    return false;
}

void getAns(vector<int>& left, vector<int>& right, int k, int n) {
    vector<int> ret;
    ret.resize(2 * n);
    int len = right.size();
    while (k--) {
        ret.clear();
        while (!right.empty()) {
            ret.push_back(right.back());
            ret.push_back(left.back());
            right.pop_back();
            left.pop_back();
        }
        reverse(ret.begin(), ret.end());
        for (int i = 0; i < n; i++) {
            left.push_back(ret[i]);
        }
        for (int i = n; i < 2 * n; i++) {
            right.push_back(ret[i]);
        }
    }
    for (int i = 0; i < ret.size() - 1; i++) {
        cout << ret[i] << " ";
    }
    cout << ret.back();
}

int main() {
    int num;
    cin >> num;
    for (int i = 0; i < num; i++) {
        int n, k;
        cin >> n >> k;
        vector<int> left;
        vector<int> right;
        for (int i = 0; i < n; i++) {
            int m;
            cin >> m;
            left.push_back(m);
        }
        for (int i = 0; i < n; i++) {
            int m;
            cin >> m;
            right.push_back(m);
        }
        getAns(left, right, k, n);
        cout << endl;
    }
}
// 64 位输出请用 printf("%lld")

你可能感兴趣的:(数据结构,算法,c++)