冲刺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模拟赛 玖」三 ...
随机推荐
- [Javascript] Create an Image with JavaScript Using Fetch and URL.createObjectURL
Most developers are familiar with using img tags and assigning the src inside of HTML. It is also po ...
- Strategic game POJ - 1463 【最小点覆盖集】
Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solu ...
- AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】
D - Disjoint Set of Common Divisors Problem Statement Given are positive integers AA and BB. Let us ...
- P4053 [JSOI2007]建筑抢修 堆贪心
思路:堆贪心 提交:1次 题解: 先按时间\(sort\),然后如果能修就直接扔堆里,不能修取堆顶比一下时间长短,把时间短的扔进堆: #include<cstdio> #include&l ...
- 【LeetCode-86】分隔链表
[题目描述] 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1-& ...
- SpringMVC 指定404、500错误页面
1.在web.xml中追加 <error-page> <error-code>404</error-code> <location>/404</l ...
- B. Uniqueness(尺取)
B. Uniqueness time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- codeforces gym #101987K -TV ShowGame(2-SAT)
题目链接: https://codeforces.com/gym/101987 题意: 有长度为$n$的只包含$B,R$的字符串 有m种关系,每个关系说出三个位置的确切字符 这三个位置的字符最多有一个 ...
- Mongodb更新数组$pull修饰符 (mongodb 修改器($inc/$set/$unset/$push/$pop/upsert))
mongodb 修改器($inc/$set/$unset/$push/$pop/upsert)) https://www.jb51.net/article/112588.htm http://bl ...
- PSO算法
1.简介粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 .该算 ...