您的位置:首页 > 其它

GYM 100971 L.Chess Match(贪心)

2017-03-23 10:52 309 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: