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个 ...
随机推荐
- 一个人的旅行(floyd+dijskra+SPFA+Bellman)
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 在Swift中使用遗留的C API
Swift的类型系统的设计目的在于简化我们的生活,为此它强制用户遵守严格的代码规范来达到这一点.毫无疑问这是一件大好事,它鼓励程序员们编写 更好更正确的代码.然而,当Swift与历史遗留的代码库.特别 ...
- PHP流程控制中不经常使用的替代语法
准备做个wordpress的主题.结果看到了例如以下的语法: <div id="primary" class="content-area"> < ...
- Object-c学习之路九(字典(NSDictionary&NSMutableDictionary))
字典的练习和使用(遍历,搜索...)(Student和Book类文件可以查看上篇博客这次不上传了.) // // main.m // NSDictionary // // Created by Wil ...
- 用MVC4+EF改写XXX系统的计划--前言
感觉自己工作了三年,重来没有自己一个人写一个项目,从开始的策划,功能需求,业务逻辑,扩展,性能优化等等方面去做,从今天起准备发比半年时间重写XXX项目,每天中午和晚上分别花半个小时和一个小时开发,周末 ...
- Sublime Text插件FileHeader实践
FileHeader是一个文件模板插件,可以定制各种文件模板和文件头部信息,保存时可以自动更新文件的修改时间.在多人开发中这个功能相当实用. 具体介绍我就不细说了,主要是分享一下在使用FileHead ...
- js继承 prototype和constructor
function a(){ this.name="aaa"; } function b(){ ...
- filezilla无法连接linux服务器
问题描述: 响应: 220 (vsFTPd 2.2.2)命令: AUTH TLS错误: 无法连接到服务器状态: 已从服务器断开 排查步骤: 1 检查服务器IP地址.用户名.密码是否正确 2 在控制面板 ...
- session的存储方式和配置
Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.我们控制用户去权限中经常用到Session来存储用户状态,这篇文章会讲下Session的存储方式.在w ...
- 什么时候会刷新备库控制文件refresh the standby database control file?
通过合理的设置,对于Primary的绝大数操作,都是可以传递到Physical Standby,datafile的操作是通过STANDBY_FILE_MANAGEMENT参数来控制的,但是即使STAN ...