I.归并数组

题目描述

a、

b是两个长度分别为

n和

m的数组,二者中没有相同的元素,我们可以定义一个长度为

+

n+m的新数组





(

,

)
merge(a,b):

如果

a和

b有一个为空数组,那么新数组就是非空的那个数组。即:





(

,

)


,





(

,

)


merge(∅,b)=b,merge(a,∅)=a.

如果

a和

b都非空,那么每次比较

a和

b的第一个元素,选择小的那个放入新数组,并将其删除。即:

如果

1
<

1
a
1

<b
1

,那么





(

,

)

[

1
]
+





(
[

2
,
.
.
.
,


]
,

)
.
merge(a,b)=[a
1

]+merge([a
2

,…,a
n

],b).我们将

a的第一个元素

1
a
1

放入新数组,然后在

a中将

1
a
1

删除,再继续和

b比较。

如果

1


1
a
1

b
1

,那么





(

,

)
=
[

1
]






(

,
[

2
,
.
.
.
,


]
)
.
merge(a,b)=[b
1

]+merge(a,[b
2

,…,b
n

]).我们将

b的第一个元素

1
b
1

放入新数组,然后在

b中将

1
b
1

删除,再继续和

a比较。

现在给你一个长度为
2

2n的序列

p(
1
,
2
,
.
.
.
,
2

1,2,…,2n的随机排列),问你是否存在两个长度为

n的数组

a和

b使得






(

,

)
p=merge(a,b)。

输入示例
第一行包含整数

(
1



2000
)
t(1≤t≤2000),表示测试数据组数。

对于每组测试数据,第一行包含一个整数

(
1



2000
)
n(1≤n≤2000)。

第二行包含
2

2n个整数

1
,
.
.
.
,

2

(
1




2

)
p
1

,…,p
2n

(1≤p
i

≤2n),保证

p是一个序列。

保证所有测试数据

n的总和不超过
2000
2000。

输出示例
对于每组测试数据,如果存在没有相同元素的数组

a和

b,使得






(

,

)
p=merge(a,b),输出"YES",否则输出"NO"。

样例#1
输入样例#1
6
2
2 3 1 4
2
3 1 2 4
4
3 2 6 1 5 7 8 4
3
1 2 3 4 5 6
4
6 1 3 7 4 5 8 2
6
4 3 2 5 1 11 9 12 8 6 10 7
输出样例#1
YES
NO
YES
YES
NO
NO
样例说明
第一个测试数据,
[
2
,
3
,
1
,
4
]






(
[
3
,
1
]
,
[
2
,
4
]
)
[2,3,1,4]=merge([3,1],[2,4])。

第二个测试数据,可以发现
[
3
,
1
,
2
,
4
]
[3,1,2,4]不能由两个长度为
2
2的数组构成。

第三个测试数据,
[
3
,
2
,
6
,
1
,
5
,
7
,
8
,
4
]






(
[
3
,
2
,
8
,
4
]
,
[
6
,
1
,
5
,
7
]
)
[3,2,6,1,5,7,8,4]=merge([3,2,8,4],[6,1,5,7])。

第四个测试数据,
[
1
,
2
,
3
,
4
,
5
,
6
]






(
[
1
,
3
,
6
]
,
[
2
,
4
,
5
]
)
[1,2,3,4,5,6]=merge([1,3,6],[2,4,5])。

以上只是单独拿某种情况以供参考。

加载最近代码
1

Debug提示
9
/9

咋这么乱嘞

这位同学请整理好自己的格式,不然我们也不知道你的问题在哪

建议:修改帖子,把题号加上,另外把这混乱的题目描述删掉(如果非要加的话截个图也行)。

这题的思路:

  1. 先找到规律,把必须放在一起的数字分成一个个小组。
  2. 用 01背包 来判断是否可以在这些小组里凑出正好 n 个数的一个大组。