题目大意:
现有一副有n张牌的卡片(n ≤ 50),编号1 ~ n,有序叠放,1在顶部,n在底部,现不停作以下操作,将顶牌丢弃,然后将下一张顶牌放到底部,直至剩下最后一张牌为止。
现有多个测例,每个测例中给出n,现要求输出丢弃牌的编号的序列,以及最后剩下的那张牌的编号,测例以n = 0结束,输出没有前导空格或拖尾空格。
注释代码:
/*
* Problem ID : UVa 10935 Throwing cards away I
* Author : Lirx.t.Una
* Language : C++ 11
* Run Time : 0.009
*/
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int
main() {
int n;//卡片的数量
int i;//计数变量
char tmp;//临时变量
while ( ~scanf("%d", &n), n ) {
//由于卡片最多为50张所以可以用char保存以节省空间
queue<char> q;//原卡片队列1 ~ n
queue<char> q_dis;//discarded cards queue,丢弃队列
for ( i = 1; i <= n; i++ )//构造原队列
q.push(i);
while ( q.size() > 1 ) {//一直操作到原队列只剩下一张牌为止
//取顶牌丢弃
tmp = q.front();
q.pop();
q_dis.push(tmp);
//将剩下的顶牌插入到底部
tmp = q.front();
q.pop();
q.push(tmp);
}
printf("Discarded cards:");//注意!!如果没有丢弃一张牌则输出不能有空格
if ( !q_dis.empty() ) {//输出第一张丢弃的牌
printf(" %d", q_dis.front());
q_dis.pop();
}
while ( !q_dis.empty() ) {//输出剩下的丢弃牌
printf(", %d", q_dis.front());
q_dis.pop();
}
putchar('\n');
printf("Remaining card: %d\n", q.front());//输出最后留下的牌
}
return 0;
}
无注释代码:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int
main() {
int n;
int i;
char tmp;
while ( ~scanf("%d", &n), n ) {
queue<char> q;
queue<char> q_dis;
for ( i = 1; i <= n; i++ )
q.push(i);
while ( q.size() > 1 ) {
tmp = q.front();
q.pop();
q_dis.push(tmp);
tmp = q.front();
q.pop();
q.push(tmp);
}
printf("Discarded cards:");
if ( !q_dis.empty() ) {
printf(" %d", q_dis.front());
q_dis.pop();
}
while ( !q_dis.empty() ) {
printf(", %d", q_dis.front());
q_dis.pop();
}
putchar('\n');
printf("Remaining card: %d\n", q.front());
}
return 0;
}
单词解释:
trailing:adj, 后面的,拖尾的
dsicard:vt, 丢弃
as long as:prep, 只要
a deck of cards:n, 一副扑克牌
deck:n, 甲板,行李舱
ordered:adj, 有序的,整齐的