#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int mx=2100;
int n,tj[mx],king[mx],match[mx];
vector<int> g[mx] ,tj0,king0;;
bool used[mx];
int main()
{
while(scanf("%d",&n),n!=0)
{
for(int i=0;i<n;i++)
scanf("%d",&tj[i]);
sort(tj,tj+n);
for(int i=0;i<n;i++)
scanf("%d",&king[i]);
sort(king,king+n);
int start=0,win=0,ping=0;int *p;
for(int i=0;i<n;i++)
{
p=lower_bound(king,king+n,tj[i]);//printf("%d ",p-king);
if(p-king>win)
{
if(p-king<=win+ping)ping--;
win++;
}
else if(tj[i]==king[win+ping])
{
ping++;
}//printf("%d %d\n",win,ping);
}
printf("%d\n",win*200-(n-win-ping)*200);
}
return 0;
}
田忌赛马的问题,起初看到题目里有二分图,我也没仔细看题目,就写了个二分图,结果TLE。
后来仔细看了一下题目,发现这句the weighted bipartite matching algorithm is a too advanced tool to deal with the problem.
In this problem, you are asked to write a program to solve this special case of matching problem.
然后,仔细想了一下,完全可以贪心的,主要的策略,先排序,如果田忌的马可以赛过king的马,这一场就定下来了,如果不能只能试试平局的情况,如果可以赢此局的话,
必须要比,但是这样可能会占用平局的数量,此时只能先减去一局平局了。