1 条题解
-
0
#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
- 上传者