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;

}

 

你可能感兴趣的:(throw)