在四川大学的第三个冠军在线编程竞赛:簿传输

好久没有写日志,奇怪的是很特别的更近,最近参加的编程方面是CSDN在学院俱乐部的在线编程插头。说到编程大赛。一共有三个问题。标题都能够csdn学院看到俱乐部。比赛有点紧张时,,第三个问题涉及到队列,提示,坑。。。也怨自己平时写代码用惯了代码提示,非常多stl的方法都是隐隐约约知道,可是详细的不知道,导致第三题没有做出来,遗憾哈!以下贴一下今天写的第三题的代码

题目 四川大学线下编程比赛第三题:书本转移

题目详情:

小强有 3 个箱子 A,B,C 用来装书,全部的书(一共n本)都按序号由小到大的顺序堆在 A上。如今他想把全部的书全都放到 C 里面去。每次他从 A 书架拿 a 本书(不够就全拿完)到
B,A 箱子翻转,然后从 B 拿 b 本书(不够就全拿完)到 C,B 箱子翻转。

然后反复操作,直到全部书都到了 C,求最后的C 里面书的顺序。具体见例子。

输入描写叙述:

输入由多组数据构成,每组数据占一行。3 个数,n(1<=n<=10^5),a(1<=a<=10^9) , b(1<=b<=10^9)。含义见题目表述。

以文件结尾。

输出描写叙述:

每组数据输出一行。首先输出数据组数,然后输出 n 个数,C 中书的排列。

答题说明:

输入例子:

4 2 1

输出例子

Case 1: 1 4 2 3

Hint

初始状态A:4321              B: 空      C:空

第一次:     A->B   A:21         B:34     C: 空

A 翻转 A:12         B:34     C: 空

B->C   A:12             B: 4     C: 3

B 翻转 A:12         B:4        C: 3

第二次:  A->B  A:空              B:214     C:3

A 翻转 A:空          B:214     C:3

B->C   A:空          B:14     C:23

B 翻转 A:空          B:41     C:23

第三次:  B->C   A:空         B:1         C:423

B 翻转  A:空         B:1         C:423

第四次:     B->C     A:空         B:空     C:1423

解析  事实上当时就看出来不用什么算法,直接模拟就好,可是自己对曾经的知识忘了好多。关于翻转直接标记一下就可以。

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
//A、B、C三个箱子用双端队列来表示
deque<int> dq[3];
//分别表示三个箱子翻转的标志,flag=0表示从front进行入队。反之从back进行入队
int flag[3];
int main()
{
	int n , a , b, T=1;
	while(cin >> n >> a >> b)
	{
		//对三个双端队列和翻转标识进行初始化
		for(int i=0;i<3;++i)
		{
			dq[i].clear();
			flag[i]=0;
		}
		//对A双端队列进行初始化
		for(int i=1;i<=n;++i)
		{
			dq[0].push_front(i);
		}
		while(!dq[0].empty() || !dq[1].empty())
		{
			//取A箱子中a本书放到B,但要分清楚是从A箱子的front处取书还是从back处取书
			if(flag[0]==0)
			{
				for(int i=0;i<a&&!dq[0].empty();++i)
				{
					//推断B箱子的翻转情况
					if(flag[1]==0){
						dq[1].push_front(dq[0].front());
					}else{
						dq[1].push_back(dq[0].front());
					}
					dq[0].pop_front();
				}
				//从A中取完书。将A进行翻转
				flag[0]=1;
			}else{
				for(int i=0;i<a&&!dq[0].empty();++i)
				{
					//推断B箱子的翻转情况
					if(flag[1]==0){
						dq[1].push_front(dq[0].back());
					}else{
						dq[1].push_back(dq[0].back());
					}
					dq[0].pop_back();
				}
				flag[0]=0;
			}
			//取B箱子中的b本书放到C中。相同要搞清楚从B的哪端进行取书
			if(flag[1]==0)
			{
				for(int i=0; i<b&&!dq[1].empty();++i)
				{
					dq[2].push_front(dq[1].front());
					dq[1].pop_front();
				}
				flag[1]=1;
			}else{
				for(int i=0; i<b&&!dq[1].empty();++i)
				{
					dq[2].push_front(dq[1].back());
					dq[1].pop_back();
				}
				flag[1]=0;
			}
		}
		//最后输出C箱子中的书的顺序
		cout << "Case " << T <<": ";
		while(!dq[2].empty())
		{
			cout << dq[2].front() << " ";
			dq[2].pop_front();
		}
		cout << endl;
		T++;
	}
	return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-12 17:32:06

在四川大学的第三个冠军在线编程竞赛:簿传输的相关文章

快乐的暑假在线编程竞赛的第一个问题:分割点游戏

主题: n个节点,m条边的无向图.每一个节点一个权值w.定义拆除一个节点的代价为与其相邻的节点的权值之和.拆除一个节点后删除全部与该节点相连的边.求拆除全部节点须要花费的最少代价.输入描写叙述:输入包括多组測试数据.每组測试数据第一行先输入n,m(1?≤?n?≤?10000; 0?≤?m?≤?20000).第二行输入n个整数wi(0?≤?wi?≤?105),接下来的m行.每行两个整数u.v代表节点u与v相连(1?≤?ui,?vi?≤?n; ui?≠?vi).输出描写叙述:对于每组測试数据.输出拆

第三章SignalR在线聊天例子

第三章SignalR在线聊天例子 本教程展示了如何使用SignalR2.0构建一个基于浏览器的聊天室程序.你将把SignalR库添加到一个空的Asp.Net Web应用程序中,创建用于发送消息到客户端的集线器(Hubs)类,创建一个Html页面让用户在该页面上发送和接收聊天信息.对于如何在MVC5环境中创建这个聊天室程序,请参阅Getting Started with SignalR 2.0 and MVC 5. SignalR是一个开源的.Net库,用于构建需要实时用户交互或实时数据更新的We

Open XML SDK 在线编程黑客松

2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的程序猿们提供一个在线动手开发,学习交流,技术分享,发挥创意与竞技的盛宴. 我们为参赛队伍准备了丰富的技术干货,国内外高手无私分享以及技术支持,逐步引导的在线学习视频教程与技术文档,场景范例,在线编程及演示环境,社区互动,丰富礼品(如极客学院特别为每位参赛人员提供月VIP码,用户可以免费学习极客学院全网课程)及

另类编辑距离-c#求解-英雄会在线编程题目

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var C

Java中的 Scanner简述(企业笔试在线编程的输入控制)

摘要: 最近进行企业在线笔试时,发现企业的笔试平台大都使用赛码网(虽然槽点很多),而且在线编程都需要使用Scanner来读取程序的输入,因此,笔者就在先辈们的成果上对Scanner做了一份全新的.详细的总结.我们知道,java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地,特此简述. 版权声明: 本文原创作者:书呆子Rico 作者博客地址:http

F(X)--c#求解-英雄会在线编程题目

先看题目: F(X) 发布公司: 有 效 期: 赛 区: CSDN 2014-04-16至2015-04-16 北京 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Java C# 题目详情 我们定义 F(x)是满足 x  mod(a*b) == 0这样的a,b的组数.现在给你一个n,你需要求出 F(n) 输入格式: 多组数据,每组第一行有一个整数n, 0 < n <= 10^11. 输出格式: 每组输出一行,满足条件的(a,b)对数 答题说明 输入样例 1 2 3

在线编程及其学习平台

在线编程(itbegin)是指不需要经过安装编程的环境,直接在互联网浏览器上编写程序,并且可以运行出结果. 在线编程的原理比较复杂,因为其涉及web前端以及后端编译系统.Web前端需要提供用户代码录入,行号.高亮语法.自动补全功能,并需要使用异步更新(Ajax) 的方法来实现上述功能.后端编译系统接收到用户的代码,并调用正确的编译器进行编译并将结果返回前端进行显示. 在线编程网站: 1.codepad:http://codepad.org/ 该网站只支持英文,支持C/C++/D/Haskell,

10个面向程序员的在线编程网站

在过去的几年里,在互联网上出现了许多为开发人员提供的在线编程网站(Coding playgrounds).这不是一件坏事情,毕竟,如果一个编程网站的话,开发者们迟早会腻的.在这些网站上,你在网页上编写代码,可以实时地看到效果.你可以编辑所有的东西并预览其效果.当然,这些网站最适合编写HTML,CSS和JavaScript代码了.最赞的地方在于他们大多都是免费的,你可以很容易地与别人分享你的编程现场,这很适合于团队工作和创新想法的交流. 如果你深入地想想这种编程模式的话,你就会发现这种模式对于项目

网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

期末考试在线编程题目 返回考试 本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 编写一个模板类型的 max 函数,求取三个输入的数据中最大的一个,将其输出(10分) 题目内容: 编写一个模板类型的max函数,该函数接收三个参数,返回其中最大的一个. 在主函数中接受键盘输入的三个数据(用空格分隔),并且将最大的一个值输出到屏幕上(