GYM 100971 L.Chess Match(贪心)

来源:互联网 发布:steam购买的软件 编辑:程序博客网 时间:2024/06/14 03:36

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 222222int 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;}
0 0
原创粉丝点击