UVa 10935 Throwing cards away I

本文介绍了一种通过编程解决特定卡片丢弃问题的方法。问题要求不断执行丢弃顶牌并将下一张牌移至底部的操作,直到只剩一张牌。文章提供了C++实现的详细代码,并解释了如何使用队列来模拟这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

        现有一副有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, 有序的,整齐的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值