小猿会表演扑克牌魔术:已知一副牌的初始顺序,经过多轮洗牌,仍然能看破任意一张牌的牌面。对于N张的一副牌,小猿的一次洗牌操作如下:将牌分为两叠,分别为前 N/2 张和后 N - N/2 张;接下来使两叠纸牌一张叉一张地交错叠在一起,原先第一张的纸牌洗牌后处于第二张。
你能破解小猿魔术的秘密吗?
第一行输入两个正整数 N M,2 <= N <= 100, 1 <= M <= 200第二行输入N个正整数,表示初始牌序列
输出经过M次洗牌后的序列
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; }
#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; }
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了。。求解
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]); |