1 条题解

  • 0
    @ 2026-1-29 22:15:53
    #include<bits/stdc++.h>
    using namespace std;
    // arr-存储当前牌堆,temp-存储每次洗牌后的临时牌堆
    int arr[1010], temp[1010];
    
    int main() {
        // [1] 读取输入:牌数n,洗牌次数k,目标位置x
        int n, k, x;
        cin >> n >> k >> x;
        
        // [2] 初始化牌堆:初始为1~n的顺序排列
        for (int i = 0; i < n; i++) {
            arr[i] = i + 1;
        }
        
        // [3] 执行k次洗牌操作
        for (int step = 0; step < k; step++) {
            int m = n / 2; // 每次洗牌时,牌堆分成两部分的长度
            int idx = 0;   // 临时数组的下标指针
            
            // [4] 交叉插入构建新牌堆
            // 前半部分arr[0..m-1] 和 后半部分arr[m..n-1] 交叉
            for (int i = 0; i < m; i++) {
                temp[idx++] = arr[i];       // 先放前半部分的第i张
                temp[idx++] = arr[m + i];   // 再放后半部分的第i张
            }
            
            // [5] 将临时数组的结果复制回原数组,作为下一次洗牌的初始状态
            for (int i = 0; i < n; i++) {
                arr[i] = temp[i];
            }
        }
        
        // [6] 输出洗牌k次后,第x张牌的编号(数组为0索引,x-1对应题目中的第x张)
        cout << arr[x - 1] << endl;
        
        return 0;
    }
    
    • 1

    信息

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