题目描述
一天小明与他同学准备赛马,他们每人有n匹马,每匹马有一个固定的战力值,战力值高的马会战胜战力值低的马并赢得比赛。每匹马只能出场比赛一次。小明偷看到了他对手每匹马的出场顺序,小明在更改自己马出场顺序后最多能赢多少场比赛。
输入描述:
输入t,代表有t组数据。每组数据输入正整数n,每人的马匹数量。下一行输入n个值a[i],代表小明每匹马的战力值。接下来一行输入n个值b[i],代表对手按顺序出场的每匹马的战力值。(t<=10, n<1000,1<=i<=n,a[i]<1e6,b[i]<1e6)
输出描述:
小明在更改马匹出场顺序后,最多能赢的场数。
示例1
输入
1
3
5 8 8
4 7 10
输出
2
这就是典型的田忌赛马问题,我们先把马儿的速度从大到小进行排序,
然后我们分三种情况进行讨论。
1 : 小明的最快的马的速度大于同学的最快的马的速度,这时候拿小明的最快的马去和同学的最快的马进行比赛。
2: 小明的最快的马的速度等于同学的最快的马的速度,然后我们这时候反正也没办法赢同学的最快的马,这时候我们就比较小明的最慢的马和同学的最慢的马的速度,如果小明的最慢的马的速度比同学的最慢的马速度慢,我们就拿小明的最慢的马去跟同学最快的马去比。
3:小明的最快的马的速度小于同学的最快的马的速度,这时候怎样都是输,就拿最慢的马去比赛。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
int a[maxn],b[maxn];
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
int bg1=1,bg2=1,en1=n,en2=n,cnt=0;
while(n--)
{
if(a[bg1]>b[bg2])
{
bg1++;
bg2++;
cnt++;
}
else if(a[bg1]==b[bg2])
{
if(a[en1]>b[en2])
{
en1--;
en2--;
cnt++;
}
else
{
en1--;
bg2++;
}
}
else
{
en1--;
bg2++;
}
}
cout<<cnt<<endl;
}
system("pause");
return 0;
}