首页 > 试题广场 >

小猿的扑克牌魔术

[编程题]小猿的扑克牌魔术
  • 热度指数:660 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小猿会表演扑克牌魔术:已知一副牌的初始顺序,经过多轮洗牌,仍然能看破任意一张牌的牌面。对于N张的一副牌,小猿的一次洗牌操作如下:将牌分为两叠,分别为前 N/2 张和后 N - N/2 张;接下来使两叠纸牌一张叉一张地交错叠在一起,原先第一张的纸牌洗牌后处于第二张。
你能破解小猿魔术的秘密吗?

输入描述:
第一行输入两个正整数 N M,2 <= N <= 100, 1 <= M <= 200
第二行输入N个正整数,表示初始牌序列


输出描述:
输出经过M次洗牌后的序列
示例1

输入

6 2
3 1 4 2 5 6

输出

1 2 6 3 4 5

说明

3 1 4 2 5 6 -> 2 3 5 1 6 4 -> 1 2 6 3 4 5

备注:
题目描述中提到的 N/2 为整除
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct card
{
   int val;
   int index;
};
bool camp(card A,card B)
{
    return A.index<B.index;
}
int main()
{
  int n,m,halfn;
  cin>>n>>m;
 halfn = n/2;   
 vector<card> cards(n);
  for(int i=0;i<n;i++)
  {
      cin>>cards[i].val;
      cards[i].index = i;
  }  
  for(int j=0;j<m;j++)
  {
      for(int i=0;i<n;i++)
      {
         if(cards[i].index<halfn)
         {
             cards[i].index = 2*cards[i].index + 1;
         }else{
             cards[i].index = (cards[i].index-halfn)*2;
         } 
      }
  }
  sort(cards.begin(),cards.end(),camp);  
  for(int i=0;i<n;i++)
  {
   if(i<(n-1)){
            cout<<cards[i].val<<" "; 
   }else{
       cout<<cards[i].val;
   }   
  }  
 return 0;   
}

发表于 2021-06-26 15:07:42 回复(0)
#include <iostream>
#include <vector>
using namespace std;
vector<int> func(vector<int> v, int m)
{
    if (m == 0)
        return v;
    vector<int> w;
    int l = v.size();
    int i = 0;
    while (i < l / 2)
    {
        w.push_back(v[l / 2 + i]);
        w.push_back(v[i]);
        i++;
    }
    if ((l - l / 2) > l / 2)    //l%2==1
    {
        w.push_back(v.back());
    }
    return func(w, --m);
}
int main()
{
    int n, m;
    cin >> n >> m;
    vector<int> v, w;
    for (int i = 0;i < n;i++)
    {
        int num;
        cin >> num;
        v.push_back(num);
    }
    w = func(v, m);
    for (int i = 0;i < w.size();i++)
    {
        cout << w[i] << " ";
    }
    cout << endl;
    return 0;
}
发表于 2021-07-28 15:27:23 回复(0)
没什么可以说的,暴力模拟既可以了
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, M;
vector<int> nums;

void sortCards() {
    vector<int> nums_new(N, 0);
    int first = 0, second = N >> 1;
    for (int i = 0; i < N; i++) {
        if (i & 0x1) nums_new[i] = nums[first++];
        else nums_new[i] = nums[second++];
    }
    nums = std::move(nums_new);
}

void solve() {
    cin >> N >> M;
    nums.assign(N, 0);
    for (auto& num : nums) cin >> num;
    for (int i = 0; i < M; i++) sortCards();
    for (auto& num : nums) cout << num << " ";
    cout << endl;
}


int main() {
    int n = 1;
    // cin >> n
    while(n--) solve();
    return 0;
}


发表于 2021-04-11 20:06:18 回复(1)
import java.util.Scanner;

public class Main {
    private static int[] arr;
    private static int m;
    private static int n;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        arr = new int[n];
        int i = 0;
        while (i<n){
            arr[i++] = scanner.nextInt();
        }
        int[] res =Main.SortCard();
        for (int r : res){
            System.out.print(r+" ");
        }

    }
    public static int[] SortCard(){
        int[] tem = new int[n];

        for (int i = 0;i<m;i++){
            int j=0,k=n/2;
            int p=0;
            while (j<n/2 && k<n){
                tem[p++]= arr[k++];
                if(j==n/2) break;
                tem[p++]= arr[j++];
            }
            int p1 = 0;
            for (int s:tem){
                arr[p1++] = s;
            }
        }
        return tem;
    }
}
兄弟们不知道为啥第四组测试的时候通过不了,最后那个24575不知道为啥变成0了。。求解
发表于 2021-12-13 15:11:13 回复(2)
n,m=map(int,input().split())
card=list(map(int,input().split()))
for i in range(m):
    temp=[]
    for k in range(n//2):
        temp.append(card[n//2:][k])
        temp.append(card[:n//2][k])
    if(n%2==1):
        temp.append(card[-1])
    card=temp
for i in card:
    print(i,end=' ')
编辑于 2021-06-24 15:05:22 回复(0)
let line1=readline();
let line2=readline();
let str1=line1.split(' ');
let str2=line2.split(' ');
let number=parseInt(str1[0]);
let times=parseInt(str1[1]);
let arr=[];
for(let i=0;i<number;i++){
    arr.push(parseInt(str2[i]));
}
let n=Math.floor(number/2);
for(let j=0;j<times;j++){
    let k;
    let arr1=arr.slice(0,n);
    let arr2=arr.slice(n);
    arr=[];
    for(k=0;k<n;k++){
        arr.push(arr2[k]);
        arr.push(arr1[k]);
    }
    if(k<arr2.length)arr.push(arr2[k]);
}
for(let i=0;i<arr.length;i++)
print(arr[i]);
我yue了,明明没错,为啥就不过
发表于 2021-04-17 16:10:42 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] arr = new int[n];
        int i = 0;
        int t1 = n, t2 = m;
        while (i < n) {
            arr[i++] = sc.nextInt();
        }
        int[] ans1 = new int[n];
        while (m>0) {
            ans1 = cardOrder(arr);
            arr = ans1;
            m--;
        }
        
        for (int num : arr)
            System.out.print(num + " ");
        //System.out.println(arr.length);
        return;
    }
    public static int[] cardOrder(int[] arr) {
        int len = arr.length;
        int Index = 0;
        int num = arr[len-1];
        int[] ans = new int[len];
        for (int i = 0; i < len/2; i++){
            if (Index%2 == 0) {
                ans[Index++] = arr[len/2+i];
                ans[Index++] = arr[i];
            } else {
                ans[Index++] = arr[i];
                ans[Index++] = arr[len/2+i];
            }
        }
        if (len%2 == 1) {
            ans[Index++] = num;
        }
        return ans;
    }
}
发表于 2021-04-08 10:52:40 回复(0)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
int main()
{
    int N,M;
    cin>>N>>M;
  
    vector<int>v1(N);
    for(int i=0;i<N;i++)
    {
        cin>>v1[i];
    }
 
    
        if(N%2==0)
        {
            while(M--)
    {
            vector<int>v2(v1.begin(),v1.begin()+N/2);
            vector<int>v3(v1.begin()+N/2,v1.begin()+N);
                  v1.clear();
               for(int i=0;i<N/2;i++)
            {
           
                 
            v1.push_back(v3[i]);
            v1.push_back(v2[i]);
            }
            }
        }
        else
        {
             while(M--)
    {
             vector<int>v2(v1.begin(),v1.begin()+(N-1)/2);
             vector<int>v3(v1.begin()+(N-1)/2,v1.begin()+N);
                 v1.clear();
               for(int i=0;i<(N-1)/2;i++)
            {
                   
            v1.push_back(v3[i]);
            v1.push_back(v2[i]);
            }
       
            v1.push_back(v3[v3.size()-1]);
       
        }
             
        }
    
    
    for(int i=0;i<N;i++)
    {
        cout<<v1[i]<<" ";
    }
    return 0;
}
发表于 2021-04-06 21:24:24 回复(0)