原题链接 # 青蛙公主比数字 ## 描述 青蛙公主和青蛙王子在进行一场比数字的游戏。游戏的规则如下:

1、双方在游戏开始的时候会分别得到同样数量的卡牌,每张卡牌上都会有一个整数。

2、每轮比赛中,双方各自拿出一张卡牌,然后比大小,大的那一方取胜;如果相等,则打平,双方都不算获胜。不论胜负或者平,使用的卡牌立即丢弃,不可再次使用。

3、所有卡牌用完后,游戏宣告结束。

问:青蛙公主最多可以获得多少轮比赛的胜利?最少可以获得多少轮比赛的胜利?

输入

一个正整数n,表示案例的数量。

每组案例中,首先是一个正整数m,表示分到每个人手上的卡牌数量。然后是m个整数,表示发到青蛙公主手上的每张卡牌上的数字;接下来还有m个整数,表示发到青蛙王子手上的每张卡牌上的数字。(m<=10000)

输出

针对每组案例,输出两个整数,第一个整数表示青蛙公主最多可以获得多少轮比赛的胜利,第二个整数表示青蛙公主最少可以获得多少轮比赛的胜利。

两个整数之间有一个空格。每组案例输出完都要换行。

样例输入

1

2

50 -10 90 10

样例输出

1 0

想法:

最多赢多少:事实上排个序暴力的去比就可以得到。
最少赢多少:其实和最多赢多少差不多,但是要把平的排除掉。那么只要公主的牌小于      等于王子手中的牌时就丢弃掉。最后看看还剩多少。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n, m;
while (cin>>n)
{
while (n--)
{
int* a, * b;
bool *f1,*f2;
cin >> m;
a = new int[m];
b = new int[m];
f1 = new bool[m];
f2 = new bool[m];
int i;
for (i = 0; i < m; i++)
{
cin >> a[i];
f1[i] = true;
}
for (i = 0; i < m; i++)
{
cin >> b[i];
f2[i] = true;
}
sort(a, a + m);
sort(b, b + m);
int count1 = 0, count2 = 0;
for (i = 0; i < m; i++)
{
int j=0;
for (j = 0; j < m; j++)
{
if (a[i] > b[j] && f1[j])
{
count1++;
f1[j] = false;
break;
}
}
for (j = 0; j < m; j++)
{
if (b[i] >= a[j] && f2[j])
{
f2[j] = false;
break;
}
}
if(j==m)
count2++;
}
cout << count1 << " " << count2 << endl;
delete[] a;
delete[] b;
delete[] f1;
delete[] f2;
}
}
return 0;
}