#include <iostream>
#include <vector>

using namespace std;

// 弹牌操作
vector<int> popCard(vector<int>& cards) {
    int n = cards.size();
    vector<int> firstHalf(cards.begin(), cards.begin() + n/2);
    vector<int> secondHalf(cards.begin() + n/2, cards.end());
    
    vector<int> newCards;
    for (int i = 0; i < n/2; i++) {
        newCards.push_back(firstHalf[i]);
        newCards.push_back(secondHalf[i]);
    }
    
    return newCards;
}

// 切牌操作
void cutCard(vector<int>& cards, int b, int e) {
    vector<int> cut;
    for (int i = b-1; i < e; i++) {
        cut.push_back(cards[i]);
    }
    for (int i = b-1; i < e; i++) {
        cards.erase(cards.begin() + b-1);
    }
    cards.insert(cards.begin(), cut.begin(), cut.end());
}

int main() {
    int N, M;
    cin >> N >> M;
    
    vector<int> cards(N);
    for (int i = 0; i < N; i++) {
        cin >> cards[i];
    }
    
    for (int i = 0; i < M; i++) {
        int operation;
        cin >> operation;
        
        if (operation == 0) {
            cards = popCard(cards);
        } else {
            int b, e;
            cin >> b >> e;
            cutCard(cards, b, e);
        }
    }
    
    for (int i = 0; i < N; i++) {
        cout << cards[i] << " ";
    }
    
    return 0;
}
``
题目描述魔术师刘谦要洗牌了请你写个程序来模拟洗牌的过程。 洗牌分弹牌和切牌两个操作: 弹牌——将牌组等分成两份然后交错相插如当前牌为1 2 3 4 5 6现在开始弹牌先将牌分成1 2 3和4 5 6然后交错相插变成1 4 2 5 3 6 切牌——从牌堆里面拿出连续的一段然后放到顶端。如当前牌为1 2 3 4 5 6切完2~5之间的4张牌后变成2 3 4 5 1 6。输入第一行为两

原文地址: http://www.cveoy.top/t/topic/hXGo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录