耳熟能详的田忌赛马居然这么精妙,感觉智商被碾压。港真我觉得我觉得还是按题目提示的二分图匹配来做A得更快(窒息)
核心思路是拿最差的干掉对方最强的
比较难想的是己方和对方最差都相等的时候,己方要不要去挑战对方最强的(挑战了可能平局,也可能输)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int t[N],k[N];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=1;i<=n;++i)
scanf("%d",&t[i]); //tian
for(int i=1;i<=n;++i)
scanf("%d",&k[i]); //king
sort(t+1,t+1+n);
sort(k+1,k+1+n);
int s1,s2,f1,f2;
s1=s2=1,f1=f2=n;
int win,lose;
win=lose=0;
while(s1<=f1)
{
if(t[s1]>k[s2]) //己方最慢大于对方最慢->赢了
{
++win;
++s1;
++s2;
}
else if(t[s1]<k[s2]) //己方最慢小于对方最慢->干掉最厉害的
{
++lose;
++s1;
--f2;
}
else //己方最慢等于对方最慢时
{
if(t[f1]>k[f2]) //不去干最快的,否则平白输一场
{
++win;
--f1;
--f2;
}
else //己方最快不大于对方最快->去挑战对方最强的
{
if(t[s1]<k[f2]) //不一定会输。。。。。比如王的最快等于最慢,这就平了。。。
++lose;
++s1;
--f2;
}
}
}
printf("%d\n",200*(win-lose));
}
return 0;
}
下为我的策略,贪心思路错误
while(l1<=n)
{
if(t[l1]>k[l2])
{
++l2;
++l1;
++sum1;
}
// else if(t[l1]==k[l2]) //这种思路会导致 72 74 85 97 74 87 95 100求得一胜一平,但是最佳是两胜两败
// {
// ++l2;
// ++l1;
// ++sum2;
// }
else
++l1;
}
int k=2*sum1+sum2-n;
printf("%d\n",k*200);