每日一题3.27.1
洗牌
解题思路: 每次读取一个数之后,算出他经过k次洗牌后的位置,只用一个长度为2n数组用来输出 根据当前数的位置,可以算出经过一次洗牌后的位置 如果当前数小于等于n(即在左手),则他下次出现的位置是 2当前位置 与之对应的当前位置 + n(即在右手)的牌,则他下次出现的位置是 2当前位置 + 1
代码实现:
#include <iostream>
#include <vector>
using namespace std;
void shuffle(int n, int k, vector<int> &result)
{
vector<int>tmp;
while (k--)
{
tmp = result;
for (int i = 0; i < n; i++)
{
result[2*i] = tmp[i];
result[2 * i + 1] = tmp[n + i];
}
}
}
int main()
{
int T,k,n;
cin >> T;
while (T--)
{
cin >> n >> k;
vector<int>result(2 * n);
for (int i = 0; i < 2 * n; i++)
cin >> result[i];
shuffle(n, k, result);
for (int j = 0; j < 2 * n; j++)
{
if (j == 0)
cout << result[j];
else
cout << ' ' << result[j];
}
cout << endl;
}
system("pause");
return 0;
}
参考答案