问题:编程
对于一副扑克牌,咱们有多种不一样的洗牌方式。一种方法是从中间某个位置分红两半,而后相交换,咱们称之为移位(shift)。好比原来的次序是123456,从第4个位置交换,结果就是561234。这个方式其实就是数组的循环移位,为了屡次进行这个操做,必须使用一种尽量快的方法来编程实现。在本题目中,还引入另一种洗牌方式,就是把前一半(若是总数是奇数,就是(n-1)/2)牌翻转过来,这种操做称之为翻转(flip)。在前面shift操做的结果上进行flip,结果就是165234。固然,若是是实际的扑克牌,直接翻转会形成正反面混在一块儿的,咱们就无论那么多了。
给定n张牌,初始次序为从1到n,通过若干次的shift和flip操做后,结果会是什么样?数组
输入:测试
输入包括多组测试数据,每组数据的第一行包括两个数 n和k。n表示牌的数目,1<n<1000,若是n为0表示输入结束,k表示下面要进行的操做数量。随后的k行,每行一个整数x,1<=x<=n,表示从第几个位置开始移位。在每一次shift操做后都接一个flip操做。code
输出:ip
对于输入的每组数据,计算通过给定的k次shift和flip操做后,各个位置的数值。并按次序在一行上输出全部牌张的值,每一个数值(包括最后一个)后面有一个空格。
内存
样例输入:io
6 1 4 0 0
样例输出:class
1 6 5 2 3 4
时间限制:1秒 内存限制:128M循环
个人代码,用C语言编写,耗时10MS 内存912kb方法
#include <stdio.h> #include <stdlib.h> void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int *fun(int *begin, int *end) { int *re = begin; while(begin <= end) { swap(begin,end); begin++; end--; } return re; } void fun3(int *data, int n, int p) { int *re = fun(data, data+n-1); int *b1 = re; int *e1 = re+(n-p)-1; int *re1 = fun(b1,e1); int *b2 = e1 + 1; int *e2 = b2+p-1; int *re2 = fun(b2,e2); int *b3 = re1; int *e3 = re1+n/2-1; int *re3 = fun(b3,e3); } int main() { int n,m,p; int *data; while(1) { scanf("%d %d", &n, &m); if(0 == n) break; else { data = (int*)malloc(sizeof(int)*n); int i; for(i = 0; i < n; i++) data[i] = i + 1; for(i = 0; i < m; i++) { scanf("%d",&p); fun3(data,n,p); } for(i = 0; i < n; i++) printf("%d ", data[i]); printf("\n"); free(data); } } return 0; }