贪心算法求解下列问题

某体育比赛在甲乙两队中进行,两队参赛的人数相同,要求所有队员必须参赛且只能参加一次比赛。每次比赛,甲乙双方各派出一人与对方进行比赛,总胜出人数最多的队将获得比赛最终的胜利。为了取得比赛的胜利,教练在比赛前需要进行相应的排兵布阵。教练在排兵布阵时,往往会参考双方队员以往的成绩,并给出一个综合性的评分,如果某队队员相比另一队队员的评分高,则获胜的机率就越高。

输入要求:输入的第一行包含一个整数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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值