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; }