洛谷B4138题解

分析

题意

nn 张编号为 1n1\sim n 的牌(nn 为偶数),每次洗牌将牌均分为前后两半,然后交叉插入合并(前 11、后 11、前 22、后 22……)。重复洗牌 kk 次后,求第 ii 个位置的牌的编号。

思路

  1. 初始化数组存储牌的初始顺序,下标对应牌的位置。
  2. 模拟洗牌过程:每次洗牌使用临时数组存储新顺序,按规则从前后两半交替取数。
  3. 重复 kk 次洗牌操作后,直接输出第 ii 个位置的数值即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int ans[N], tmp[N];
int main() {
int n, k, i;
cin >> n >> k >> i;
int m = n / 2;
for (int j = 1; j <= n; j++) ans[j] = j;
for (int t = 0; t < k; t++) {
int pos = 1;
for (int j = 1; j <= m; j++) {
tmp[pos++] = ans[j];
tmp[pos++] = ans[j + m];
}
for (int j = 1; j <= n; j++) ans[j] = tmp[j];
}
cout << ans[i] << endl;
return 0;
}

洛谷B4138题解
https://lijingshu2014.github.io/2026/08/03/洛谷B4138题解/
作者
lijingshu
发布于
2026年8月3日
许可协议