贪心
先将两队从大到小分别排序。
1.如果我方最强的可以击败敌方最强的,换句话说,我方最强的是无敌的,既然一定会赢,那就拖走一个敌方最强的,正确性显然。
2.如果我方最弱的都能赢对方最弱的,说明对方最弱的一定会输,换句话来说我方任何一个都能战胜对方最弱的,为了保证我方剩下的更强,我们就用消耗最弱的去打对方最弱的,正确性显然。
先忽略一下平局这种可能。
3.如果敌方最弱的不是来卖萌的(强于我方最弱的),而且敌方最强的是无敌的。换句话说,我方一定会输一局。那么就选择让我方最弱的去和敌方最强的去打(田忌赛马的故事大家都看过吧),让输的利用价值更大。
PS:
因为存在平局的可能,当对方最弱的和我方最弱的平局时……
有两种情况:
1.
这时已知我方最强的弱于对方最强的(不然不会轮到比较最弱的)。那么至少输一次。本着让输的价值更大得原则,让我方最弱的去消耗对方最强的,让输的这一次价值更大,这样的话,一定会更优。
2.
我方最强的与对方最强的平局。那对方最强的至少会阻止我方得一分。因为我方最弱的最多得一分的话,不如让我方最弱的去打对方最强的,而阻止它阻止我们得分,这样对于总分是不会变化的,并且使得我方最弱的更强。
我方 2 4 5 7
敌方 2 3 6 7
所以平局时让我方最弱打敌方最强会更优。
总结一下代码怎么打:
如果我队最强的能战胜对方最强的,就让这两者作战。
如果我队最弱的能战胜对方最弱的,就让这两者作战。
如果上述都不符合,就让我队最弱的去和对方最强的作战。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans=0,ans1=0;
int a[1000005],b[1000005],c[1000005];
int main()
{
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+1+n);
sort(b+1,b+1+n);
int l1=1,l2=1,r1=n,r2=n;
for(int i=1;i<=n;i++)
{
if(a[r1]>b[r2])
{
ans+=2;
r1--;
r2--;
}
else if(a[l1]>b[l2])
{
ans+=2;
l1++;
l2++;
}
else
{
if(a[l1]==b[r2]) ans+=1;
else if(a[l1]<b[r2]) ans+=0;
l1++;
r2--;
}
}
cout<<ans;
l1=1,l2=1,r1=n,r2=n;
for(int i=1;i<=n;i++)
{
if(b[r2]>a[r1])
{
ans+=2;
r2--;
r1--;
}
else if(b[l2]>a[l1])
{
ans+=2;
l2++;
l1++;
}
else
{
if(b[l2]==a[r1]) ans1+=1;
else if(b[l2]<a[r1]) ans1+=2;
l2++;
r1--;
}
}
cout<<' '<<ans1;
return 0;
}