GYM 100971 L.Chess Match(贪心)

本文介绍了一个简单的算法,用于判断两支队伍在比赛中是否有获胜的可能性。通过将每支队伍成员的战力进行排序,并使用贪心策略来匹配双方的队员,以此来评估哪支队伍更有可能赢得比赛。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
两支队伍比赛,每支都有n个人,给出每队每个人的战力,问两边是否有胜利的可能
Input
第一行一整数n表示每支队伍的人数,之后n个整数a[i]表示一队每个人的战力,最后n个整数b[i]表示二队每个人的战力,a[i],b[i]两两不同(1<=n<=2e5,1<=a[i],b[i]<=1e9)
Output
如果两支队伍都有获胜可能则输出Both,如果只有第一支队伍有获胜可能则输出First,如果只有第二支队伍有获胜可能则输出Second
Sample Input
5
1 3 5 7 9
2 4 6 8 10
Sample Output
Both
Solution
贪心,对两支队伍的战力排序,用两个指针分别从两队的高战力往低战力移动,对于第一支队伍的每个人让其打败第二支队伍中小于其战力的最高战力,最后统计第一支队伍胜利场数,如果大于n/2说明第一支队伍有获胜可能,对于第二组同理
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 222222
int n,a[maxn],b[maxn];
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)scanf("%d",&b[i]);
        sort(a+1,a+n+1);
        sort(b+1,b+n+1);
        int i=n,j=n,num1=0,num2=0;
        while(i>=1)
        {
            while(j>=1&&b[j]>a[i])j--;
            if(j==0)break;
            num1++,i--,j--;
        }
        i=n,j=n;
        while(j>=1)
        {
            while(i>=1&&a[i]>b[j])i--;
            if(i==0)break;
            num2++,i--,j--;
        }
        if(num1>n/2&&num2>n/2)printf("Both\n");
        else if(num1>n/2)printf("First\n");
        else if(num2>n/2)printf("Second\n");
        else printf("None\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值