P1650 田忌赛马 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
#include <algorithm>
#include<cstdio>
#include <map>
using namespace std;
const int N=1e5+100;
int n;
map<int,int>a,b;//映射,速度->数量
int maxa=-1,mina=N,maxb=-1,minb=N;
int cnt=0,res=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//田忌的马的速度
{
int x;
cin>>x;
maxa=max(maxa,x);//最大速度
mina=min(mina,x);//最小速度
a[x]++;//该速度的马的数量
}
for(int i=1;i<=n;i++)//齐王的马的速度
{
int x;
cin>>x;
maxb=max(maxb,x);//最大速度
minb=min(minb,x);//最小速度
b[x]++;//该速度的马的数量
}
//田忌会赢的
for(int i=mina;i<=maxa;i++)//从田忌最小速度开始枚举到最大速度
{
cnt=a[i];//该速度的马的数量
for(int j=1;j<=cnt;j++)
{
for(int k=i-1;k>=minb;k--)//从齐王比田忌当前马速度慢的马的速度开始枚举到最小速度
{
if(b[k]>0)//齐王有此速度的马,田忌就赢一局
{
res+=200;
a[i]--;
b[k]--;
//该数量的马都减1
break;//找到就终止此次枚举
}
}
}
}
//田忌会赢的已经枚举完,所以只剩平局和会输的
for(int i=mina;i<=maxa;i++)//从田忌的马的最小速度开始枚举到最大速度
{
cnt=a[i];//该速度的马的数量
for(int j=1;j<=cnt;j++)
{
if(b[i]>0)//齐王也有该速度的马,平局
{
a[i]--;
b[i]--;
continue;
}
for(int k=maxb;k>0;k--)//田忌输的
{
if(b[k]>0)
{
b[k]--;
a[i]--;
res-=200;
break;
}
}
}
}
cout<<res;
return 0;
}