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个 ...
随机推荐
- Visual Studio® 2010 Web Deployment Projects站点编译生成bin同时发表插件
VS2010环境下: 1.Visual Studio® 2010 Web Deployment Projects下载地址: http://www.microsoft.com/downlo ...
- 虚拟化之KVM的安装续篇
介于上篇文章用的网络的方式安装系统并且磁盘文件格式为raw,不支持快照,所以再写下这篇文章,方便后续查看. 目的:通过nfs安装系统,磁盘文件格式为qcow2(支持快照). 如下操作和上篇文章只有部分 ...
- php 添加 redis 扩展模块
由于PHP源码中并未有redis的文件,所以需要自己下载. 下载地址: http://pecl.php.net/get/redis-2.2.5.tgz [root@study package]# ta ...
- 使用SqlBulkCopy批量插入数据
static void Main(string[] args) { //定义与目标表结构相同的DataTable DataTable dataTable = new DataTable(); data ...
- R - 递推
Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平 ...
- B - A + B Again
Description There must be many A + B problems in our HDOJ , now a new one is coming. Give yo ...
- Python调用C/C++动态链接库
Python调用C/C++动态链接库 2013年07月26日 ⁄ 综合 ⁄ 共 3219字 ⁄ 字号 小 中 大 ⁄ 评论关闭 吐槽(可略过):不知不觉,4月份毕业,5月份进入团队,已有7个月.大 ...
- java压缩/解压缩zip格式文件
因为项目要用到压缩.解压缩zip格式压缩包,只好自己封装一个,对于网上流行的中文乱码的问题,本文的解决方法是用apache的包代替jdk里的.基本上还是比较好用的. 废话少说,直接上代码. } ...
- Bootstrap+Thinkphp3.2+Auth认证+jquery-validator后台
Auth权限认证 本例采用auth权限认证,用户和用户组采用多对多关系处理,自动添加rule规则,带有jquery-validator插件,自动控制菜单显示或隐藏. config.php中的配置 ...
- java之坑-----List中的重复添加同一对象
java中List的add方法不检查List中是否含有已加入项 java中List的add方法不检查List中是否含有已加入项 java中List的add方法不检查List中是否含有已加入项 重要事情 ...