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第三次数据结构上机实验解题报告相关推荐

  1. 数据结构第七次上机实验-解题报告

    数据结构第七次上机实验-解题报告 7-1 序列调度 (100 分) 题目 思路 参考代码 7-2 最大最小差 (100 分) 题目 思路 参考代码 7-3 二叉树最短路径长度 (100 分) 题目 思 ...

  2. 数据结构荣誉课-第一次实验-解题报告

    JLU-数据结构荣誉课-第一次实验-解题报告 一.重复计数 题目 思路 参考代码 二.报数游戏 题目 思路 参考代码 三.算术表达式计算 题目 思路 参考代码 四.最喜爱的序列 题目 思路 单调队列 ...

  3. 2019级计算机学院数据结构编程作业,数据结构上机实验报告

    时间:2019-05-12 08:38:58 作者:admin 数据结构实验报告 课程 数据结构 _ 院 系 专业班级 实验地点姓 名 学 号 实验时间 指导老师 数据结构上机实验报告1 一﹑实验名称 ...

  4. 20172324 2018-2019-1《程序设计与数据结构》实验2报告

    20172324 2018-2019-1<程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...

  5. 20172329 2017-2018-2 《程序设计与数据结构》实验五报告

    这是这学期最后一次实验了,也是学到了很多东西,希望自己可以可以善始善终,加油! 让我们开始这一篇博客吧! 20172329 2017-2018-2 <程序设计与数据结构>实验五报告 课程: ...

  6. 20172318 2017-2018-2 《程序设计与数据结构》实验3报告

    20172318 2017-2018-2 <程序设计与数据结构>实验3报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 陆大岳 学号:20172318 实验教师:王 ...

  7. 《程序设计与数据结构》实验四报告

    学号 2017-2018-2 <程序设计与数据结构>实验四报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 康皓越 学号:20172326 实验教师:王志强 实验日 ...

  8. 20172329 2017-2018-2 《程序设计与数据结构》实验四报告

    20172329 2017-2018-2 <程序设计与数据结构>实验四报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 王文彬 学号:20172329 实验教师:王 ...

  9. 20172307 2018-2019-1 《程序设计与数据结构》实验3报告

    20172307 2018-2019-1 <程序设计与数据结构>实验3报告 课程:<程序设计与数据结构> 班级: 1723 姓名:黄宇瑭 学号:07 实验教师:王志强 实验日期 ...

最新文章

  1. 什么时候用activity什么时候用fragment
  2. 解决:org.xml.sax.SAXParseException: 元素类型 “head“ 必须由匹配的结束标记 “</head>问题
  3. html图片上下翻滚展示代码
  4. curl 使用 ~/.netrc
  5. mac 上开发需要的软件
  6. 用ASP.NET Core MVC 和 EF Core 构建Web应用 (一)
  7. Spring Boot集成Redis缓存之模拟高并发场景处理
  8. html绘制word柱状图,word如何制作柱状图
  9. multer处理post请求的代码演示
  10. 笔记--Spring in action
  11. 关于Element UI中页面样式小问题
  12. Mastering Oracle SQL学习笔记(join句法专题第六部份)
  13. poj 1502 单源最短路径
  14. 关于计算机技术职业资格那些事
  15. 移动通信-WCDMA物理信道
  16. ios苹果开发者账号申请流程(公司类型)
  17. [BBC纪录片][2009][自然界最惊异的事件][Nature's.Most.Amazing.Events][中英字幕][蓝光720P高清][全6集][17.77GB]
  18. zabbix官网下载地址:https://sourceforge.net/projects/zabbix/files/ZABBIX Latest Stable/
  19. 【矩阵论】矩阵的相似标准型(3)
  20. 跨境电商财税合规问题汇总 如何推动跨境电商财税合规

热门文章

  1. html移动端背景图片大小,移动端怎么样让图片宽高比例正好适应手机当前屏幕全屏大小?...
  2. win10安装TensorFlow填坑笔记
  3. AI数学基础之:奇异值和奇异值分解
  4. Codeforces 1139E(二分图最大匹配)
  5. Archimate设计案例:银行门店数字化转型
  6. 数据库测试包含哪些?
  7. 99%的人都不知道!Python、C、C 扩展、Cython 差异对比!
  8. 《吊打面试官》系列-ArrayList
  9. html页面引入vue.js + elementUI 离线包快速开发前端页面
  10. 谈谈制定数据治理战略路线图的方法