冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱
1、二叉树(binary)
- .二叉树
- (binary.cpp/c/pas)
- 【问题描述】
- 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- ()若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- ()若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- ()左、右子树也分别为二叉排序树;
- ()没有键值相等的结点。
- 完全二叉树:只有最下面的两层结点度能够小于2,并且最下面一层的结点
- 都集中在该层最左边的若干位置的二叉树。
- 图1中,(a)和(b)是完全二叉树,(c)和(d)是非完全二叉树。
- 给出N个数,且这N个数构成1至N的排列。现在需要你按顺序构建一棵二叉
- 排序树,并按照层次遍历的方式输出它,然后判断它是否是一棵完全二叉树。
- 【输入格式】
- 输入文件名为binary.in。
- 输入文件包含两行。第一行为一个正整数N;第二行为1至N的排列。
- 【输出格式】
- 输出文件名为binary.out。
- 输出文件包含两行。第一行为构建出的二叉排序树的层次遍历;第二行判
- 断是否是完全二叉树:若是输出yes,否则输出no。
- 【输入输出样例1】
- binary.in
- binary.out
- yes
- 【输入输出样例2】
- binary.in
- binary.out
- no
- 【数据规模与约定】
- 对于100%的数据,≤N≤。
题目
tag:模拟
思路:其实这道题没有看上去那么复杂。插入的时候比节点大就往右走,反之往左走,走到头了放进去,最后建个树。判断是不是完全二叉树要看最大的节点是不是在自己应该在的位置,因为仔细观察发现完全二叉树是每一层从左往右一个一个放,每个节点的数值和编号应该相等(感谢dalao这句话的思路)。
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- using namespace std;
- int maxx,list[][],tree[<<],deep,n;
- void insert(int o,int x)
- {
- maxx=max(maxx,o);
- if(!tree[o]){
- tree[o]=x;
- return;
- }
- if(x>tree[o]) insert(o<<|,x);
- else insert(o<<,x);
- }
- void dfs(int o,int f)
- {
- deep=max(deep,f);
- if(tree[o<<]){
- list[f+][++list[f+][]]=tree[o<<];
- dfs(o<<,f+);
- }
- if(tree[o<<|]){
- list[f+][++list[f+][]]=tree[o<<|];
- dfs(o<<|,f+);
- }
- }
- int main()
- {
- //freopen("binary.in","r",stdin);
- //freopen("binary.out","w",stdout);
- int x;
- scanf("%d",&n);
- for(int i=;i<=n;++i){
- scanf("%d",&x);
- insert(,x);
- }
- list[][]=tree[];
- list[][]=;
- dfs(,);
- for(int i=;i<=deep;++i)
- for(int j=;j<=list[i][];++j)
- printf("%d ",list[i][j]);
- puts("");
- if(maxx!=n) puts("no");
- else puts("yes");
- return ;
- }
2、列车调度(manage)
- 【问题描述】
- 有N辆列车,标记为1,,,…,N。它们按照一定的次序进站,站台共有K个轨
- 道,轨道遵从先进先出的原则。列车进入站台内的轨道后可以等待任意时间后出
- 站,且所有列车不可后退。现在要使出站的顺序变为N,N-,N-,…,,询问K的
- 最小值是多少。
- 例如上图中进站的顺序为1,,,,,,,,,则出站的顺序变为
- ,,,,,,,,。
- 【输入格式】
- 输入文件名为manage.in。
- 输入共2行。
- 第 行包含1个正整数N,表示N辆列车。
- 第 行包含N个正整数,为1至N的一个排列,表示进站次序。
- 【输出格式】
- 输出文件名为manage.out。
- 输出共1行,包含1个整数,表示站台内轨道数K的最小值。
- 【输入输出样例1】
- manage.in
- manage.out
- 【输入输出样例2】
- manage.in
- manage.out
- 【数据规模与约定】
- 对于 %的数据,N≤;
- 对于 %的数据,N≤;
- 对于 %的数据,N≤。
题目
tag:二分查找
思路:单纯模拟用时较长(但是O(n2)居然能过???),正解是构造非降序列,比如现在的序列是(5,6,9,11),要把10插入进去,5,6,9都比10小,11比10大就停在11后面,序列变成(5,6,9,10),虽然单个的数值改变了,但是原本的单调性没变,因此我们可以二分查找第一个比要插入的数大的数(0011型)。
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<cstdlib>
- #define maxn 100010
- using namespace std;
- int n,a[maxn],f[maxn],ans=;
- int main()
- {
- //freopen("manage.in","r",stdin);
- //freopen("manage.out","w",stdout);
- scanf("%d",&n);
- for(int i=;i<=n;++i) scanf("%d",&a[i]);
- f[]=a[];
- for(int i=;i<=n;++i){
- int l=lower_bound(f+,f+ans+,a[i])-f;
- f[l]=a[i];
- ans=max(ans,l);
- }
- printf("%d",ans);
- return ;
- }
3、保留道路(road)
- 【问题描述】
- 很久很久以前有一个国家,这个国家有N个城市,城市由1,,,…,N标号,
- 城市间有M条双向道路,每条道路都有两个属性g和s,两个城市间可能有多条道
- 路,并且可能存在将某一城市与其自身连接起来的道路。后来由于战争的原因,
- 国王不得不下令减小花费从而关闭一些道路,但是必须要保证任意两个城市相互
- 可达。
- 道路花费的计算公式为wG*max{所有剩下道路的属性g}+wS*max{所有剩下道
- 路的属性s},其中wG和wS是给定的值。国王想要在满足连通性的前提下使这个花
- 费最小,现在需要你计算出这个花费。
- 【输入格式】
- 输入文件名为road.in。
- 第一行包含两个正整数N和M。
- 第二行包含两个正整数wG和wS。
- 后面的M行每行描述一条道路,包含四个正整数u,v,g,s,分别表示道路连接
- 的两个城市以及道路的两个属性。
- 【输出格式】
- 输出文件名为road.out。
- 输出一个整数,表示最小花费。若无论如何不能满足连通性,输出-。
- 【输入输出样例】
- road.in
- road.out
- 【数据规模与约定】
- 对于 %的数据,N≤,M≤;
- 对于 %的数据,N≤,M≤;
- 对于 %的数据,N≤,M≤;
- 对于 %的数据,N≤,M≤,wG,wS,g,s≤。
题目
tag:最小生成树、轻度玄学(雾)
思路:二维费用的kruskal,很有研究的价值。平时我们做的最小生成树都只有一维,突然多了一个维度,而且还有系数,有点让人手足无措,我们应当以什么标准来选择,加和?乘积?比值?都不行吧,可以随便举反例。正解是,两个权值g,s任选其一作为标准从小到大排序,比如选择g就以g的大小排,再看s的大小,我们造一个栈,从底到顶s从小到大,每放一条边调整栈中各边的位置,做一遍kruskal,记录答案,时间复杂度是O(nm)。
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #define maxn 100010
- #define ll long long
- #define inf 1ll<<60
- using namespace std;
- int gmax,smax,n,m,G,S,fa[maxn],st[maxn],top,tot;
- ll ans=inf;
- struct Edge{
- int u,v,g,s;
- }e[maxn];
- bool cmp(Edge x,Edge y)
- {
- return x.g<y.g;
- }
- int find(int x)
- {
- return x==fa[x]?x:fa[x]=find(fa[x]);
- }
- int main()
- {
- //freopen("road.in","r",stdin);
- //freopen("road.out","w",stdout);
- int u,v,g,s;
- scanf("%d%d",&n,&m);
- scanf("%d%d",&G,&S);
- for(int i=;i<=m;++i) scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].g,&e[i].s);
- sort(e+,e+m+,cmp);
- for(int i=;i<=m;++i){
- int j=;
- for(j=;j<=n;++j) fa[j]=j;
- for(j=top;j>=;--j)
- if(e[st[j]].s>e[i].s)
- st[j+]=st[j];
- else break;
- top++;
- st[j+]=i;
- tot=;
- for(j=;j<=top;++j)
- {
- int k1=find(e[st[j]].u),k2=find(e[st[j]].v);
- if(k1!=k2){
- fa[k1]=k2;
- st[++tot]=st[j];
- }
- if(tot==n-) break;
- }
- if(tot==n-) ans=min(ans,1ll*e[i].g*G+1ll*e[st[n-]].s*S);
- top=tot;
- }
- if(ans==inf) printf("-1");
- else printf("%I64d",ans);
- return ;
- }
————————————————懒得打分割线啊——————————————————
芒果君:考了这么多次,这场翻车最厉害,都倒数了QAQ 还是想太多
冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱的更多相关文章
- 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
- 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱
题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
- 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱
题1 素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...
- 冲刺Noip2017模拟赛8 解题报告——五十岚芒果酱
1.鼎纹 [问题描述] 据说鼎纹的 种制造 式是 铜模印出来的,这是我国古代劳动 智慧 的结晶.铜模印过的地 ,会留下深深的印记,经过时间的炼化,洗 练成历史的遗存. 聪明的古代劳动人民拥有一个 a ...
- 冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱
1.ksum(ksum) [问题描述] Peter喜欢玩数组.NOIP这天,他从Jason手里得到了大小为n的一个正整数 数组. Peter求出了这个数组的所有子段和,并将这n(n+)/2个数降序排序 ...
- 冲刺Noip2017模拟赛4 解题报告——五十岚芒果酱
题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了 ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
随机推荐
- 002转载----C# 基于OneNet 的物联网数据通信
作者:lnwin521 来源:CSDN 原文:https://blog.csdn.net/lnwin521/article/details/84549606 (遇到404情况请复制粘贴后再打开)版权声 ...
- 彻底解决eslint与webstorm针对vue的script标签缩进处理方式冲突问题
彻底解决eslint与webstorm针对vue的script标签缩进处理方式冲突问题 2018年12月08日 21:58:26 Kevin395 阅读数 1753 背景不多介绍了,直接上代码. ...
- java+上传文件夹
最近在学习百度的开源上传组件WebUploader,写了一些示例以记录.WebUploader的缺点是没有一个比较好的现成的界面,这个界面需要自己去实现.自由度高了一些. WebUploader是由B ...
- Domain Socket本地进程间通信
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loop ...
- 费马小定理 x
费马小定理(Fermat Theory) 是数论中的一个重要定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p).即:假如a是整数,p是质数,且a,p互质(即两 ...
- 网络流24题 P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- cc.Sprite组件
1.精灵 精灵(Sprite)是Cocos系列的核心概念之一,是Cocos Creator最常用的显示图像的组件. 游戏中显示一个图片,我们就可以把这个叫做"精灵" sprite, ...
- 在AspNetCore3.0中使用Autofac
1. 引入Nuget包 Autofac Autofac.Extensions.DependencyInjection 2. 修改Program.cs 将默认ServiceProviderFactory ...
- vue的一些随笔
一.点击路由后的样式,可以在路由文件index.js中设置 再在样式里面设置active的类名对应的样式. ———————————————————————————————————————————— 二 ...
- elasticsearch sql插件配置(5.0及以上版本)
github官方参考地址:https://github.com/NLPchina/elasticsearch-sql/ 采用 git + node 的方式,所以安装前需要先安装好node,node n ...