1 条题解

  • 0
    @ 2026-1-30 19:34:50
    #include <iostream>
    using namespace std;
    
    int main() {
        int n, k, x;                // n=牌的数量,k=洗牌次数,x=目标位置(1索引)
        // [1] 输入牌数、洗牌次数和目标位置
        cin >> n >> k >> x;
        int arr[1005];              // 存储当前牌堆的编号(n≤1000,数组大小足够)
        // [2] 初始化牌堆,初始编号为1到n
        for (int i = 0; i < n; ++i) {
            arr[i] = i + 1;
        }
        int m = n / 2;              // 每次洗牌分成两堆的大小
        // [3] 重复k次洗牌操作
        for (int step = 0; step < k; ++step) {
            int new_arr[1005];      // 存储洗牌后的新牌堆
            int idx = 0;            // 新牌堆的填充索引
            // [4] 交替从前后两堆取元素,生成新牌堆
            for (int i = 0; i < m; ++i) {
                new_arr[idx++] = arr[i];          // 取前半部分的第i张
                new_arr[idx++] = arr[m + i];      // 取后半部分的第i张
            }
            // [5] 将原牌堆更新为洗牌后的新牌堆
            for (int i = 0; i < n; ++i) {
                arr[i] = new_arr[i];
            }
        }
        // [6] 输出第x张牌的编号(x是1索引,转换为数组的0索引x-1)
        cout << arr[x - 1] << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    1195
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者