7-12 两个有序序列的中位数(25 分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
输入样例1:
5 1 3 5 7 9 2 3 4 5 6
输出样例1:
4
输入样例2:
6 -100 -10 1 1 1 1 -50 0 2 3 4 5
输出样例2:
1
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <utility>
using namespace std;
#define INF 100000000
typedef pair<int, int> P;
#define f first
#define s second
const double eps = 1e-8;
#define N 100001
int n;
int a[N], b[N], ans[N * 2], k = 1;
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
for(int i = 0; i < n; i++)
scanf("%d", &b[i]);
int i = 0, j = 0;
while(i < n || j < n){
if(i < n && j < n){
if(a[i] <= b[j]){
ans[k++] = a[i++];
}else{
ans[k++] = b[j++];
}
}else if(i < n){
ans[k++] = a[i++];
}else{
ans[k++] = b[j++];
}
}
printf("%d", ans[n]);
return 0;
}
/**
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n * 2; i++)
scanf("%d", &num[i]);
sort(num + 1, num + 1 + 2 * n);
printf("%d", num[n]);
return 0;
}
*/
7-15 是否完全二叉搜索树(30 分)
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过20的正整数N
;第二行给出N
个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N
个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES
,如果该树是完全二叉树;否则输出NO
。
输入样例1:
9
38 45 42 24 58 30 67 12 51
输出样例1:
38 45 24 58 42 30 12 67 51
YES
输入样例2:
8
38 24 12 45 58 67 42 51
输出样例2:
38 45 24 58 42 12 67 51
NO
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <utility>
using namespace std;
#define INF 100000000
typedef pair<int, int> P;
#define f first
#define s second
const double eps = 1e-8;
#define N 21
struct node{
int w;
struct node * l, *r;
};
int ans[N * 200];
int n, m;
node * root = NULL;
node * add(node * p, int d);
void solve(node * p, int v);
int main()
{
cin >> n;
for(int i = 0; i < n; i++){
cin >> m;
root = add(root, m);
}
solve(root, 0);
int num[N], k = 0;
for(int i = 0; i < N * 200; i++)
if(ans[i] > 0)
num[k++] = ans[i];
for(int i = 0; i < k; i++){
printf("%d%c", num[i], i == k - 1?'\n':' ');
}
int cnt = 0;
for(int i = 0; i < n; i++)
if(ans[i] > 0)
cnt++;
printf(cnt == n?"YES":"NO");
return 0;
}
node *add(node * p, int d)
{
if(p == NULL){
p = (node *)malloc(sizeof(node));
p->w = d;
p->l = p->r = NULL;
}else if(p->w > d){
p->r = add(p->r, d);
}else
p->l = add(p->l, d);
return p;
}
void solve(node * p, int v)
{
if(p == NULL)
return;
ans[v] = p->w;
solve(p->l, v * 2 + 1);
solve(p->r, v * 2 + 2);
}
7-14 愿天下有情人都是失散多年的兄妹(25 分)
呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?
输入格式:
输入第一行给出一个正整数N
(2≤N
≤104),随后N
行,每行按以下格式给出一个人的信息:
本人ID 性别 父亲ID 母亲ID
其中ID
是5位数字,每人不同;性别M
代表男性、F
代表女性。如果某人的父亲或母亲已经不可考,则相应的ID
位置上标记为-1
。
接下来给出一个正整数K
,随后K
行,每行给出一对有情人的ID
,其间以空格分隔。
注意:题目保证两个人是同辈,每人只有一个性别,并且血缘关系网中没有乱伦或隔辈成婚的情况。
输出格式:
对每一对有情人,判断他们的关系是否可以通婚:如果两人是同性,输出Never Mind
;如果是异性并且关系出了五服,输出Yes
;如果异性关系未出五服,输出No
。
输入样例:
24
00001 M 01111 -1
00002 F 02222 03333
00003 M 02222 03333
00004 F 04444 03333
00005 M 04444 05555
00006 F 04444 05555
00007 F 06666 07777
00008 M 06666 07777
00009 M 00001 00002
00010 M 00003 00006
00011 F 00005 00007
00012 F 00008 08888
00013 F 00009 00011
00014 M 00010 09999
00015 M 00010 09999
00016 M 10000 00012
00017 F -1 00012
00018 F 11000 00013
00019 F 11100 00018
00020 F 00015 11110
00021 M 11100 00020
00022 M 00016 -1
00023 M 10012 00017
00024 M 00022 10013
9
00021 00024
00019 00024
00011 00012
00022 00018
00001 00004
00013 00016
00017 00015
00019 00021
00010 00011
输出样例:
Never Mind
Yes
Never Mind
No
Yes
No
Yes
No
No
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <utility>
using namespace std;
#define INF 100000000
typedef pair<int, int> P;
typedef long long ll;
#define f first
#define s second
const double eps = 1e-8;
#define N 100002
struct person{
int fa, ma;
char sex;
};
person per[N];
int arela[N], brela[N], k1, k2;
void dfs(int x, int deep, int * a, int & k)
{
if(deep > 5 || x == -1)
return;
a[k++] = x;
dfs(per[x].fa, deep + 1, a, k);
dfs(per[x].ma, deep + 1, a, k);
}
int main()
{
int n, id, fa, ma;
int a, b;
char sex;
scanf("%d", &n);
for(int i = 0; i < N; i++)
per[i].fa = per[i].ma = -1;
while(n--)
{
scanf("%d %c%d%d", &id, &sex, &fa, &ma);
per[id].sex = sex;
per[id].fa = fa;
per[id].ma = ma;
//printf("%c %c\n", per[1].sex, per[4].sex);
fa != -1 && per[fa].sex != 'F'?per[fa].sex = 'M':0;
ma != -1 && per[ma].sex != 'M'?per[ma].sex = 'F':0;
}
scanf("%d", &n);
while(n--)
{
scanf("%d%d", &a, &b);
if(per[a].sex == per[b].sex)
printf("Never Mind\n");
else{
k1 = k2 = 0;
dfs(a, 1, arela, k1);
dfs(b, 1, brela, k2);
bool flag = false;
for(int i = 0; i < k1; i++)
for(int j = 0; j < k2; j++)
{
if(arela[i] == brela[j]){
flag = true;
//printf("same %d %d\n", arela[i], i);
}
}
printf(flag?"No\n":"Yes\n");
}
}
return 0;
}