POJ3032 Card Trick(队列)
题目链接。
分析:
在虚拟OJ做的时候卡了下(没读懂题)。
题意大体是这样的,举个例子吧。
对于2143,先拿1次,2放到队列末端变成1432,拿走1,剩下432;
拿2次,(4,3)放到末端,变成2,4,3,拿走2,剩下4,3;
拿3次,把4拿到末端,变成3,4(第一次),拿3到末端,变成4,3(第二次),拿4到末端,变成3,4(第3次),拿走3,剩下4.
OK结束了。
思路就是倒着模拟,用的是循环队列。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 100 int qu[MAXN]; int main(){ int T, n, i, front, rear, j; scanf("%d", &T); while(T--){ scanf("%d", &n); front = rear = 0; qu[rear++] = n; for(i=n-1; i>=1; i--){ front--; front = (front+MAXN)%MAXN; qu[front] = i; for(j=0; j<i; j++){ rear--; rear = (rear+MAXN) % MAXN; front--; front = (front+MAXN) % MAXN; qu[front] = qu[rear]; } } for(i=front; i != rear; i = (i+1)%MAXN){ if(i == front) printf("%d", qu[i]); else printf(" %d", qu[i]); } putchar('\n'); } return 0; }