JLU第三次数据结构上机实验解题报告
T1:二叉树最长路径
题目
给定一棵二叉树T,求T中的最长路径的长度,并输出此路径上各结点的值。若有多条最长路径,输出最右侧的那条。
INPUT
第1行,1个整数n,表示二叉树有n个结点.
第2行,2n+1个整数,用空格分隔,表示T的扩展先根序列, -1表示空指针,结点用编号1到n表示。
OUTPUT
第1行,1个整数length,length表示T中的最长路径的长度。
第2行,length+1个整数,用空格分隔,表示最右侧的最长路径。
Sample
INPUT
5
1 2 -1 -1 3 4 -1 -1 5 -1 -1
OUTPUT
2
1 3 5
Time limit
100ms
Memory limit
5MB
Data range
1≤n≤100000
Solution
递归读树,再dfs求深度,最深的那个就是答案,栈存路径,每次深度相等或大于迭代路径即可实现最右最优
赛时AC代码
#include <bits/stdc++.h>using namespace std;int read(){int x=0,y=1;char ch=getchar();while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();if(ch=='-')y=-1,ch=getchar();while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return x*y;
}int stac[100005],top;
int ans[100005],mx;int n;
struct Node{int lef,rig;
}t[100005];void get(int x){if(x == -1)return;t[x].lef = read();if(t[x].lef != -1)get(t[x].lef);t[x].rig = read();if(t[x].rig != -1)get(t[x].rig);
}void dfs(int x){if(t[x].lef == -1 && t[x].rig == -1){if(mx <= top){mx = top;for(int i=1;i<=top;i++)ans[i] = stac[i];}return;}stac[++top] = t[x].lef;if(t[x].lef != -1)dfs(t[x].lef);top--;stac[++top] = t[x].rig;if(t[x].rig != -1)dfs(t[x].rig);top--;
}int main(){scanf("%d",&n);int rt = read();get(rt);stac[++top] = rt;dfs(rt);printf("%d\n",mx - 1);for(int i=1;i<=mx;i++){printf("%d",ans[i]);if(i != mx)printf(" ");}return 0;
}
T2:森林的层次遍历
题目
给定一个森林F,求F的层次遍历序列。森林由其先根序列及序列中每个结点的度给出。
INPUT
第1行,1个整数n,表示森林的结点个数.
第2行,n个字符,用空格分隔,表示森林F的先根序列。字符为大小写字母及数字。
第3行,n个整数,用空格分隔,表示森林F的先根序列中每个结点对应的度。
OUTPUT
1行,n个字符,用空格分隔,表示森林F的层次遍历序列。
Sample
INPUT
14
A B C D E F G H I J K L M N
4 0 3 0 0 0 0 2 2 0 0 0 1 0
OUTPUT
A M B C G H N D E F I L J K
Time limit
100ms
Memory limit
5MB
Data range
1≤n≤100000
Solution
递归读入森林,把根节点依次入队,之后正常bfs即可
赛时AC代码
#include <bits/stdc++.h>using namespace std;int read(){int x=0,y=1;char ch=getchar();while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();if(ch=='-')y=-1,ch=getchar();while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return x*y;
}int n;
char fir[100005][15];
int d[100005];
int now;
int head[100005],nex[100005],to[100005],ce;
queue<int> q;
int ansq[100005],tot;
int nta[1000005],tp;void add(int u,int v){to[++ce] = v,nex[ce] = head[u],head[u] = ce;
}void get(int x,int up){for(int i=1;i<=d[x];i++){add(x,++now);get(now,x);}
}void bfs(){while(!q.empty()){int u = q.front();ansq[++tot] = q.front();q.pop();for(int i=head[u];i;i=nex[i]){int v = to[i];nta[++tp] = v;}for(int i=tp;i>=1;i--)q.push(nta[i]);tp = 0;}
}int main(){n = read();for(int i=1;i<=n;i++)scanf("%s",fir[i]);for(int i=1;i<=n;i++)d[i] = read();now = 0;while(now < n){q.push(++now);get(now,0);}bfs();for(int i=1;i<=tot;i++){printf("%s",fir[ansq[i]]);if(i != tot)printf(" ");}return 0;
}
T3:纸带切割
题目
有一条细长的纸带,长度为 L 个单位,宽度为一个单位。现在要将纸带切割成 n 段。每次切割把当前纸带分成两段,切割位置都在整数单位上,切割代价是当前切割纸带的总长度。每次切割都选择未达最终要求的最长纸带切割,若这样的纸带有多条,则任选一条切割。如何切割,才能完成任务,并且总代价最小。
INPUT
第1行,1个整数n,表示切割成的段数.
第2行,n个整数Li,用空格分隔,表示要切割成的各段的长度.
OUTPUT
第1行,1个整数,表示最小的总代价。
第2行,若干个整数,用空格分隔,表示总代价最小时每次切割的代价。
Sample
INPUT
5
5 6 7 2 4
OUTPUT
54
24 13 11 6
Time limit
100ms
Memory limit
5MB
Data range
1≤n≤100000
1≤Li≤200000000,1≤i≤n
Solution
本题与 [NOIP2004 提高组] 合并果子 相同,思想同为贪心,每次取最小两个即可,答案倒序输出
赛时AC代码
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <iostream>
using namespace std;
priority_queue<long long,vector<long long>,greater<long long> > q;
long long ans;
long long que[100005],tot;bool cmp(int x,int y){return x > y;
}int main(){int a;scanf("%d",&a);for(int i=1;i<=a;i++){long long b;scanf("%lld",&b);q.push(b);}for(int i=1;i<=a-1;i++){long long num1,num2;num1=q.top();q.pop();num2=q.top();q.pop();q.push(num1+num2);ans+=num1+num2;que[++tot] = num1 + num2;}printf("%lld\n",ans);sort(que+1,que+1+tot,cmp);for(int i=1;i<=tot;i++){printf("%lld",que[i]);if(i != tot)printf(" ");}return 0;
}
T4:序列乘积
题目
两个递增序列A和B,长度都是n。令 Ai 和 Bj 做乘积,1≤i,j≤n.请输出n*n个乘积中从小到大的前n个。
INPUT
第1行,1个整数n,表示序列的长度, 1≤n≤100000.
第2行,n个整数Ai,用空格分隔,表示序列A.
第3行,n个整数Bi,用空格分隔,表示序列B.
OUTPUT
1行,n个整数,用空格分隔,表示序列乘积中的从小到大前n个。
Sample
INPUT
5
1 3 5 7 9
2 4 6 8 10
OUTPUT
2 4 6 6 8
Time limit
100ms
Memory limit
5MB
Data range
1≤n≤100000
1≤Ai≤40000 1≤Bi≤40000
Solution
题中数组有个很明显需要利用的性质是有序,回想上学期所学的矩阵,可以明显感觉到两数组相乘可幻化成矩阵,矩阵每行是有序的,那么我们将每一行第一个元素扔进堆里,每次取堆顶同时将其右边元素扔进去即可。
可惜心态崩了,比赛结束没多久才调出来,甚至还优化了一点点。。。
赛后AC代码
#include <bits/stdc++.h>using namespace std;#define int long longint n;
int a[100005];
int b[100005];
int ans[100005],tot;
int las[100005];struct Node{int x,y;friend bool operator< (const Node& l,const Node& r){return a[l.x] * b[l.y] > a[r.x] * b[r.y];}
};
priority_queue<Node> q;Node maknod(int x,int y){Node ret;ret.x = x;ret.y = y;return ret;
}signed main(){scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);las[i] = 1;}a[n + 1] = 1e9;for(int i=1;i<=n;i++)scanf("%lld",&b[i]);b[n + 1] = 1e9;int na = 1,nb = 1;while(tot < n){nb = 1;Node qwq;while(a[na] * b[nb] <= a[na + 1] * b[1] && tot < n){while(!q.empty() && tot < n){qwq = q.top();q.pop();if(b[qwq.y] * a[qwq.x] > a[na] * b[nb]){q.push(qwq);break;}ans[++tot] = b[qwq.y] * a[qwq.x];las[qwq.x] ++;q.push(maknod(qwq.x,las[qwq.x]));}ans[++tot] = a[na] * b[nb];nb++;}las[na] = nb;q.push(maknod(na,las[na]));na++;while(!q.empty() && b[q.top().y] * a[q.top().x] <= a[na] * b[1] && tot < n){qwq = q.top();q.pop();ans[++tot] = b[qwq.y] * a[qwq.x];las[qwq.x] ++;q.push(maknod(qwq.x,las[qwq.x]));}}for(int i=1;i<=n;i++){printf("%lld",ans[i]);if(i != n)printf(" ");}
}
/*
5
1 1 5 9 9
1 6 7 7 8
*/
JLU第三次数据结构上机实验解题报告相关推荐
- 数据结构第七次上机实验-解题报告
数据结构第七次上机实验-解题报告 7-1 序列调度 (100 分) 题目 思路 参考代码 7-2 最大最小差 (100 分) 题目 思路 参考代码 7-3 二叉树最短路径长度 (100 分) 题目 思 ...
- 数据结构荣誉课-第一次实验-解题报告
JLU-数据结构荣誉课-第一次实验-解题报告 一.重复计数 题目 思路 参考代码 二.报数游戏 题目 思路 参考代码 三.算术表达式计算 题目 思路 参考代码 四.最喜爱的序列 题目 思路 单调队列 ...
- 2019级计算机学院数据结构编程作业,数据结构上机实验报告
时间:2019-05-12 08:38:58 作者:admin 数据结构实验报告 课程 数据结构 _ 院 系 专业班级 实验地点姓 名 学 号 实验时间 指导老师 数据结构上机实验报告1 一﹑实验名称 ...
- 20172324 2018-2019-1《程序设计与数据结构》实验2报告
20172324 2018-2019-1<程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...
- 20172329 2017-2018-2 《程序设计与数据结构》实验五报告
这是这学期最后一次实验了,也是学到了很多东西,希望自己可以可以善始善终,加油! 让我们开始这一篇博客吧! 20172329 2017-2018-2 <程序设计与数据结构>实验五报告 课程: ...
- 20172318 2017-2018-2 《程序设计与数据结构》实验3报告
20172318 2017-2018-2 <程序设计与数据结构>实验3报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 陆大岳 学号:20172318 实验教师:王 ...
- 《程序设计与数据结构》实验四报告
学号 2017-2018-2 <程序设计与数据结构>实验四报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 康皓越 学号:20172326 实验教师:王志强 实验日 ...
- 20172329 2017-2018-2 《程序设计与数据结构》实验四报告
20172329 2017-2018-2 <程序设计与数据结构>实验四报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 王文彬 学号:20172329 实验教师:王 ...
- 20172307 2018-2019-1 《程序设计与数据结构》实验3报告
20172307 2018-2019-1 <程序设计与数据结构>实验3报告 课程:<程序设计与数据结构> 班级: 1723 姓名:黄宇瑭 学号:07 实验教师:王志强 实验日期 ...
最新文章
- 什么时候用activity什么时候用fragment
- 解决:org.xml.sax.SAXParseException: 元素类型 “head“ 必须由匹配的结束标记 “</head>问题
- html图片上下翻滚展示代码
- curl 使用 ~/.netrc
- mac 上开发需要的软件
- 用ASP.NET Core MVC 和 EF Core 构建Web应用 (一)
- Spring Boot集成Redis缓存之模拟高并发场景处理
- html绘制word柱状图,word如何制作柱状图
- multer处理post请求的代码演示
- 笔记--Spring in action
- 关于Element UI中页面样式小问题
- Mastering Oracle SQL学习笔记(join句法专题第六部份)
- poj 1502 单源最短路径
- 关于计算机技术职业资格那些事
- 移动通信-WCDMA物理信道
- ios苹果开发者账号申请流程(公司类型)
- [BBC纪录片][2009][自然界最惊异的事件][Nature's.Most.Amazing.Events][中英字幕][蓝光720P高清][全6集][17.77GB]
- zabbix官网下载地址:https://sourceforge.net/projects/zabbix/files/ZABBIX Latest Stable/
- 【矩阵论】矩阵的相似标准型(3)
- 跨境电商财税合规问题汇总 如何推动跨境电商财税合规
热门文章
- html移动端背景图片大小,移动端怎么样让图片宽高比例正好适应手机当前屏幕全屏大小?...
- win10安装TensorFlow填坑笔记
- AI数学基础之:奇异值和奇异值分解
- Codeforces 1139E(二分图最大匹配)
- Archimate设计案例:银行门店数字化转型
- 数据库测试包含哪些?
- 99%的人都不知道!Python、C、C 扩展、Cython 差异对比!
- 《吊打面试官》系列-ArrayList
- html页面引入vue.js + elementUI 离线包快速开发前端页面
- 谈谈制定数据治理战略路线图的方法