By Jalan
知识工具需求
数学
数据结构和算法
语言
题干
模仿洗牌机
初始的状态如下
S1, S2, ..., S13,
H1, H2, ..., H13,
C1, C2, ..., C13,
D1, D2, ..., D13,
J1, J2
给一个数组,第i位的值是j代表吧第i位的值移动到第j位去.(1-n)
输入条件
K<=20是重复次数,下面一行是给定的洗牌序列.
输出条件
输出结果,末尾不能有空格
例子
例1
输入
2
36 52 37 38 3 39 40 53 54 41 11 12 13 42 43 44 2 4 23 24 25 26 27 6 7 8 48 49 50 51 9 10 14 15 16 5 17 18 19 1 20 21 22 28 29 30 31 32 33 34 35 45 46 47
输出
S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13 D10 D11 D12 S3 S4 S6 S10 H1 H2 C13 D2 D3 D4 H6 H3 D13 J1 J2 C1 C2 C3 C4 D1 S5 H5 H11 H12 C6 C7 C8 C9 S2 S8 S9 H10 D5 D6 D7 H4 H13 C5
题解
第一次
思路
- 创建初始数组origin,把值加密成1-53
- 输入洗牌数组shuffle.创建洗牌结果数组result
- 创建洗牌函数shuffleFunction每次洗牌把结果填充到result里,然后把result赋值给orign重复调用
- 输出
预期时间复杂度
K*53
编写用时
24分钟,今天第一题,快的话应该14分钟就能写完,
代码
CPP
#include <bits/stdc++.h>
#include <stdio.h>
#include <vector>
using namespace std;
void shuffleFunction(vector<int> &a, vector<int> &b, vector<int> shuffle)
{
for (int i = 1; i < 55; i++)
{
b[shuffle[i]] = a[i];
}
a = b;
}
int main(int argc, char const *argv[])
{
//1
vector<int> origin(55);
for (int i = 0; i < 55; i++)
{
origin[i] = i;
}
//2
int K;
scanf("%d", &K);
vector<int> shuffle(55);
for (int i = 1; i < 55; i++)
{
scanf("%d", &shuffle[i]);
}
vector<int> result(55);
//3
for (int i = 0; i < K; i++)
{
shuffleFunction(origin, result, shuffle);
}
//4
for (int i = 1; i < 55; i++)
{
int temp = result[i];
if (temp <= 13)
{
printf("S%d", temp);
}else if (temp<=26) {
printf("H%d",temp-13);
}else if (temp<=39) {
printf("C%d",temp-26);
}else if (temp<=52) {
printf("D%d",temp-39);
}else if (temp==53) {
printf("J1");
}else if (temp==54) {
printf("J2");
}
if (i!=54)
{
printf(" ");
}
}
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@
也欢迎关注我的CSDN账号呀,接下来两个月我应该会按这个格式更新所有的PTA甲级题目
**开心code每一天**