Tsinghua dsa pa2
第一题,列车调度(train)
在这个题目中,模拟压栈出栈,同时判断调度方案是否可行。
#include <cstdio>
#include <cstring>
#define MAX 1600005
using namespace std;
int stack[MAX];//stack[0]作为旗标
int top;
int pushed;//已经压入的最大值
int out[MAX];//输出
char result[*MAX][];
int result_len;//result的长度
int main(int argc,char *argv[]){
// freopen("in.txt","r",stdin);
int len,capacity;
scanf("%d %d", &len, &capacity);
for(int k=;k<len;k++)
scanf("%d",&(out[k]));
int i=;//出栈的元素的下标
while(i<len){//当i==len时,所有out中的元素都成功出栈
if(stack[top]==out[i]){
strcpy(result[result_len++],"pop");
top--;
i++;
}else if(stack[top]<out[i]){
while(pushed<out[i]){
stack[++top]=++pushed;
if(top>capacity){
printf("No\n");
return ;
}
strcpy(result[result_len++],"push");
}
}else{
printf("No\n");
return ;
}
}
for(int j=;j<result_len;j++)
printf("%s\n",result[j]);
return ;
}
第二题,隧道(Tunel),通过95%
这道题的关键在于如何在O(1)时间内获取队列中的最大值。提示见邓俊辉老师的数据结构习题解答讲义。
#include <cstdio>
using namespace std;
#define MAX 2000005 int height[MAX];
int head,tail; typedef struct{
int index;
int count;
}Mirrorqueue;
Mirrorqueue que[MAX];
int headq,tailq; int main(int argc, char *argv[]){
// freopen("in.txt","r",stdin);
int n;
scanf("%d\n", &n);
char c;
while(n--){
scanf("%c", &c);
int counttmp=;
int i=;
switch (c){
case 'E':
scanf("%d\n", height+tail);
for(i=tailq;i>headq;i--){
if(height[que[tailq-].index]<height[tail]){
counttmp+=que[tailq-].count;
tailq--;
}else if(height[que[tailq-].index]==height[tail]){
que[tailq-].count+=counttmp;
break;
}else{
que[tailq].index=tail;
que[tailq].count=counttmp;
tailq++;
break;
}
}
if(i==headq){
que[tailq].index=tail;
que[tailq].count=counttmp;
tailq++;
}
tail++;
break;
case 'M':
scanf("%c",&c);//忽略换行符
printf("%d\n",height[que[headq].index]);
break;
case 'D':
scanf("%c",&c);//忽略换行符
que[headq].count--;
if(que[headq].count==)
headq++;
printf("%d\n",height[head++]);
}
}
return ;
}
第三题,真二叉树重构(Rebuild),通过95%
提示:
#include <cstdio>
using namespace std;
#define MAX 4000005
int preord[MAX],postord[MAX]; int stack[];
int top; int printed,nodeNums;//已经打印的结点数目和总的结点数目
int search(int *source,int head,int tail,int e){
for(int i=head;i<=tail;i++){
if(source[i]==e)
return i;
}
}
int rebuild(int *pre, int *post,int preh,int pret,int posth,int postt){
if(preh==pret){
if(printed==nodeNums-){
printf("%d\n",pre[preh]);
printed++;
}
else{
printf("%d ",pre[preh]);
printf("%d ",stack[--top]);
printed+=;
}
return ;
}
//store pre[preh];//根
stack[top++]=pre[preh];
int lroot=search(post,posth,postt,pre[preh+]);//在后序遍历中查找左子树根
int rroot=search(pre,preh,pret,post[postt-]);
rebuild(pre,post,preh+,rroot-,posth,lroot);
rebuild(pre,post,rroot,pret,lroot+,postt-);
//输出
return ;
}
int main(int argc, char *argv[]){
// freopen("in.txt","r",stdin);
int nodeNum;
char c;
scanf("%d\n",&nodeNum);
nodeNums=nodeNum;
for(int i=;i<nodeNum;i++)
scanf("%d",preord+i);
scanf("%c",&c);//忽略换行符
for(int j=;j<nodeNum;j++)
scanf("%d",postord+j);
rebuild(preord,postord,,nodeNum-,,nodeNum-);
return ;
}
Tsinghua dsa pa2的更多相关文章
- Tsinghua 2018 DSA PA2简要题解
反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...
- Tsinghua dsa mooc pa1
第一题Range 关键:二分查找,查找不大于一个数的最大下标. #include <cstdlib> #include <cstdio> 4 int compare (cons ...
- Tsinghua 2018 DSA PA3简要题解
CST2018 3-1-1 Sum (15%) 简单的线段树,单点修改,区间求和. 很简单. CST2018 3-1-2 Max (20%) 高级的线段树. 维护区间最大和,区间和,左边最大和,右边最 ...
- 介绍DSA数字签名,非对称加密的另一种实现
接下来我们介绍DSA数字签名,非对称加密的另一种实现. DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS ...
- 安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
安装rpm包,特别是没有GPGkey校验,原因是rpm版本过低导致的. 代码如下: warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY ...
- 【Tsinghua OJ】灯塔(LightHouse)问题
描述 海上有许多灯塔,为过路船只照明.从平面上看,海域范围是[1, 10^8] × [1, 10^8] . (图一) 如图一所示,每个灯塔都配有一盏探照灯,照亮其东北.西南两个对顶的直角区域.探照灯的 ...
- 【Tsinghua OJ】祖玛(Zuma)问题
描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到轨 道上并加入原有序列中.一旦有三个或更多同色的珠子变成相 ...
- 【Tsinghua OJ】范围查询(Range)问题
[问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...
- 【Tsinghua OJ】多米诺骨牌(domino)问题
(domino.c/cpp)[问题描述] 小牛牛对多米诺骨牌有很大兴趣,然而她的骨牌比较特别,只有黑色和白色的两种.她觉 得如果存在连续三个骨牌是同一种颜色,那么这个骨牌排列便是不美观的.现在她有n个 ...
随机推荐
- 云脉提供表单识别API接口自助接入
如今随着信息化.数字化时代的到来,利用纯人工进行数据录入已经不能满足海量信息数字化的需求.这时候有OCR表单识别技术,一切问题都能够迎刃而解了.云脉表单识别SDK采用成熟的OCR技术,通过创建票据的模 ...
- ios常用的几个动画代码
#import "MianViewController.h" #import <QuartzCore/QuartzCore.h> @interface MianVi ...
- 数据库学习之ADO.NET五大对象
1 [ADO.NET] ado.net 是一种数据访问技术,使得应用程序能够连接到数据存储,并以各种方式操作存储在里面的数据. 2 [ADO.NET五大常用对象] Connec ...
- android 补间动画
android开发过程中,为了更好的展示应用程序,应用程序添加动画,能够很好地实现这个功能.如果动画中的图像变化有一定的规律,可以采用自动生成图像的方式来生成动画,例如图像的移动.旋转.缩放等.自动生 ...
- 初始AngularJS
<!-- AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 AngularJS 应用程序. ng-model 指令把元素值(比如输入域的值)绑 ...
- 整理:GET与POST的区别
1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的. (1).所谓安全的意味着该操作用于获取信息而非修改信息.换句话说,GET 请求一般不应产生副作用.就是说,它仅仅是获取资源信息,就 ...
- ecshop物料库存管理
1.创建物流库存表.sql语句: CREATE TABLE IF NOT EXISTS `emws_materials` (`id` mediumint(8) unsigned NOT NULL au ...
- 在Win8上安装pyinstaller打包python成为可执行文件
首先我使用的电脑系统是: Windows-8-6.2.9200 Python的版本是: 2.7.8 默认已安装python2.7且设置好了环境变量. 仅为个人记录,非教程. 首先先安装pip: 首先先 ...
- android 手势滑动
1.概述, 两次都是画曲线统计图用到手势滑动.左滑动,右滑动曲线图翻页 2.直接上代码 3.注: 第一次使用的时候是implement了 OnTouchListener 接口,是在画图布局上layou ...
- Oracle EBS-SQL (CST-2):检查有BOM但成本不基于累积的数据.sql
select c.segment1 物料编码, ...