某体育比赛在甲乙两队中进行,两队参赛的人数相同,要求所有队员必须参赛且只能参加一次比赛。每次比赛,甲乙双方各派出一人与对方进行比赛,总胜出人数最多的队将获得比赛最终的胜利。为了取得比赛的胜利,教练在比赛前需要进行相应的排兵布阵。教练在排兵布阵时,往往会参考双方队员以往的成绩,并给出一个综合性的评分,如果某队队员相比另一队队员的评分高,则获胜的机率就越高。
输入要求:输入的第一行包含一个整数n,表示甲乙双方出场的总人数。其后的2行,每行包含n个整数,分别表示甲乙两队各个队员的评分成绩。
输出要求:输出一个整数k,表示甲队最大可能赢得的场次。
样例输入:
3
92 83 71
95 87 74
样例输出:
2
题目要求使用贪心算法,首先明确某队要赢的必要条件,即当甲队要求胜利时,乙队评分最高与甲队评分最低对打;甲队评分最高与乙队评分次高对打。只要保证这两个条件,甲队就能胜利。具体代码实现如下:
1.(时间复杂度较高)
#include<iostream>
using namespace std;
#define Maxsize 999
int A[Maxsize];//甲队平均成绩
int B[Maxsize];//乙队平均成绩
int ans=0;
int n;
int flag = 0;
void quickSort(int* arr, int begin, int end)
{
if (begin < end)
{
int temp = arr[begin]; //将区间的第一个数作为基准数
int i = begin; //从左到右进行查找时的“指针”,指示当前左位置
int j = end; //从右到左进行查找时的“指针”,指示当前右位置
while (i < j)
{
while (i<j && arr[j] > temp)
j--;
arr[i] = arr[j];
while (i < j && arr[i] <= temp)
i++;
arr[j] = arr[i];
}
arr[i] = temp;
quickSort(arr, begin, i - 1);
quickSort(arr, i + 1, end);
}
else
return;
}
int Max(int a[])
{
int b=0;
int max = a[0];
for (int i = 0;i < n;i++)
if (max < a[i])
{
max = a[i];
b = i;
}
return b;
}
int Min(int a[])
{
int b=0;
int min = a[0];
for (int i = 0;i < n;i++)
if (min > a[i])
{
min = a[i];
b = i;
}
return b;
}
void Find()
{
for (int j = n - 1;j >= 0;j--)
{
for (int i = 0;i < n;i++)
{
if (flag == 0)
{
int k = Min(A);
if (A[k] < B[j])
{
A[k] = 0;
B[j] = 0;
flag = 1;
break;
}
}
else if (flag == 1)
{
int h = Max(A);
if (A[h] > B[j])
{
ans++;
A[h] = 0;
B[j] = 0;
flag += 1;
break;
}
}
else if (flag == 2)
{
if (A[i] != 0 && B[j] != 0)
{
if (B[j] < A[i])
{
A[i] = 0;
B[j] = 0;
ans++;
}
}
}
}
}
}
int main()
{
cin >> n;
for (int i = 0;i < n;i++)
{
cin >> A[i];
}
for (int i = 0;i < n;i++)
{
cin >> B[i];
}
quickSort(B, 0, n - 1);
Find();
cout << ans;
return 0;
}