Uva 10935 Throwing cards away I

题目意思:有N张牌,标号为1~N,且牌以叠好,从上到小就是标号1~N的牌,只要牌堆数量大于等于2的时候,就采取如下操作:将最上面的牌扔掉(即离开牌堆)。刚才那张牌离开后,再将新的最上面的牌放置于牌堆最后一张。

要求输出:依次输出被扔掉的牌,按扔掉的顺序输出。最后要输出最后留下的一张牌。

思路:用一个队列来模拟,被扔掉的牌相当于取出后进行pop操作,把最上面的牌放置最后相同于取出后进行pop操作和push操作,直至队列的size小于等于1

注意点:因为题目对格式的要求,所以第一张被扔掉的牌格式处理上于后面被扔掉的牌有所不同。

 

/*
	UvaOJ 10935
	Emerald
	Sat 2 May 2015
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using namespace std;

queue <int> q;

void Init( int N ) {
	while( !q.empty() ) {
		q.pop();
	}
	for( int i=1; i<N+1; i++ ) {
		q.push( i );
	}
}

void Throw( ) {
	printf( "Discarded cards: %d", q.front() );
	q.pop();
	q.push( q.front() );
	q.pop();
	while( q.size() >= 2 ) {
		printf( ", %d", q.front() );
		q.pop();
		q.push( q.front() );
		q.pop();
	}
	printf( "\n" );
	printf( "Remaining card: %d\n", q.front() );
}

int main() {
	int N;
	while( cin >> N && N ) {
		Init( N );
		if( N==1 ) {
			printf( "Discarded cards:\n" );
			printf( "Remaining card: 1\n" );
		} else {
			Throw();
		}
	}
	return 0;
}

 

posted @ 2015-05-06 00:27  Emerald  阅读(246)  评论(0编辑  收藏  举报