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个 ...
随机推荐
- 【考虑周全+数学变形】【11月赛】Is it a fantastic matrix?
Is it a fantastic matrix? Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/ ...
- Ffplay视频播放流程
主框架流程 下图是一个使用“gcc+eygpt+graphviz+手工调整”生成的一个ffplay函数基本调用关系图,其中只保留了视频部分,去除了音频处理.字幕处理以及一些细节处理部分. 注:图中的数 ...
- andeoid硬件解码学习 (二)
Finally, I must say, finally, we get low-level media APIs in Android, the Android hardware decoding ...
- jquery方法详解
jquery方法详解 http://www.365mini.com/doc
- 详解AJAX核心 —— XMLHttpRequest 对象 (上)
我要说的内容都是非常基础的内容,高手就免看了,如果看了欢迎给点意见啊.新手或者对低层还不是很了解的人可以看看,帮助理解与记忆. XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程 ...
- Java三大特征之继承(二)
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- jQuery中的DOM操作总结
jQuery中的DOM操作 DOM是Document Object Medel的缩写,它的意思是文档对象模型,根据W3C的官方说法,DOM是一种跟浏览器,平台以及语言都没有关系的一种规范,也就是一种接 ...
- Struts2 校验
Struts2校验格式: actionName-methodName-invalidation.xml 该配置文件必须和action类在同一个包下. <?xml version="1 ...
- externn "C"解析
1.揭密extern "C" extern "C"包含双重含义,从字面上即可得到:首先,被它修饰的目标是 "extern”的:其次,被它修饰的目标是 ...
- 深入理解Autofac生命周期
为什么Autofac表现的这样? 这里似乎有几个陷阱,虽然这里只有一个------并且这个值得重申: Autofac将会跟踪每一个他所创建的可销毁的组件实例,无论这个实例是怎样被获取的. 当然,最终. ...