第一题,列车调度(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的更多相关文章

  1. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  2. Tsinghua dsa mooc pa1

    第一题Range 关键:二分查找,查找不大于一个数的最大下标. #include <cstdlib> #include <cstdio> 4 int compare (cons ...

  3. Tsinghua 2018 DSA PA3简要题解

    CST2018 3-1-1 Sum (15%) 简单的线段树,单点修改,区间求和. 很简单. CST2018 3-1-2 Max (20%) 高级的线段树. 维护区间最大和,区间和,左边最大和,右边最 ...

  4. 介绍DSA数字签名,非对称加密的另一种实现

    接下来我们介绍DSA数字签名,非对称加密的另一种实现. DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS ...

  5. 安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法

    安装rpm包,特别是没有GPGkey校验,原因是rpm版本过低导致的. 代码如下: warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY ...

  6. 【Tsinghua OJ】灯塔(LightHouse)问题

    描述 海上有许多灯塔,为过路船只照明.从平面上看,海域范围是[1, 10^8] × [1, 10^8] . (图一) 如图一所示,每个灯塔都配有一盏探照灯,照亮其东北.西南两个对顶的直角区域.探照灯的 ...

  7. 【Tsinghua OJ】祖玛(Zuma)问题

    描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到轨 道上并加入原有序列中.一旦有三个或更多同色的珠子变成相 ...

  8. 【Tsinghua OJ】范围查询(Range)问题

    [问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...

  9. 【Tsinghua OJ】多米诺骨牌(domino)问题

    (domino.c/cpp)[问题描述] 小牛牛对多米诺骨牌有很大兴趣,然而她的骨牌比较特别,只有黑色和白色的两种.她觉 得如果存在连续三个骨牌是同一种颜色,那么这个骨牌排列便是不美观的.现在她有n个 ...

随机推荐

  1. 让magento的validate验证hidden field

    Object.extend(Validation, { isVisible : function(elm) { return true; }, insertAdvice : function(elm, ...

  2. eclipse默认编码设置为utf-8

    需要设置的几处地方为: Window->Preferences->General ->Content Type->Text->JSP 最下面设置为UTF-8 Window ...

  3. qsort的几种用法

    #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b){ return *(int ...

  4. zb的生日(暴搜dfs)

    zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...

  5. Mac神器Iterm2的Shell Integration的用法和注意事项

    在iterm2 v3.0版本中有了个新的feature——Shell Integration,其中比较重要的功能就是可以取代传统的“rz”.“sz”(即:向服务器上传.下载文件) 具体的用法可以参见官 ...

  6. python3 module中__init__.py的需要注意的地方

    网上关于__init__.py的作用的资料到处都是,我在此就不再啰嗦哪些了. 若有需要.请各位看官去搜搜即可. 最近刚开始用Python3 就遇到了这个比较有意思的事情 闲言少叙,下面要介绍的是pyt ...

  7. 使用react-native做一个简单的应用-04界面主框架

    欢迎界面搭建完毕,我们接下来需要做的就是搭建应用程序的主体框架啦.首先我们看一下首页的截图: 从图中看到,我将首页分为了三部分:用黑色矩形表示的头部,绿色表示的内容和红色表示的底部. 下面我们需要解决 ...

  8. iOS之极光推送

    注册JPush账号 JPush官网 下载SDK 下载地址:https://www.jpush.cn 根据文档进行集成 文档:http://docs.jpush.io/guideline/ios_gui ...

  9. 改变VS2013的菜单栏字母为小写

    REG ADD HKCU\Software\Microsoft\VisualStudio\12.0\General /v SuppressUppercaseConversion /t REG_DWOR ...

  10. 查看DB文件的空间使用情况

    可以使用如下语句获得DB文件的空间使用 use dbName SELECT DB_NAME() AS DbName, name AS FileName, size/128.0 AS CurrentSi ...