P1650 田忌赛马

贪心。

从最小的马开始考虑。我们肯定优先让这匹最小的马赢。

实在赢不了了就去自杀。这样可以保证最优,因为不管哪匹马都是一样的代价,虽然小的把可以赢的位置占了,但是大的可以有更多机会赢其他马,所以这样是对的。

但是还要考虑平局。

平局到底打不打?

要分情况讨论。

1、如果有一个更大的马只能自杀,那我们让这个更大的马把下面的某个平局打了,然后下面那个马去自杀,这样没有损失,最优。

2、全局没有上述情况可以打对方的平局马,保持平局即可。道理和上面一致,没有必要自杀。

#include<bits/stdc++.h>
using namespace std;
#define orz cout<<"lyakioi!!!!!!!!!!!!!!!!!"<<endl
inline int r(){int s=0,k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){s=s*10+c-'0';c=getchar();}return s*k;}
int n,beg,a[1000001],ans,b[1000001],used[1000001];
int main()
{
//	freopen("P1650_2.in","r",stdin);
	n=r();
	for(int i=1;i<=n;i++)a[i]=r();
	for(int i=1;i<=n;i++)b[i]=r();
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++)
	{
		int eq=0,eqt,ok=0;
		for(int j=n;j;j--)
		{
			if(used[j])continue;//用过 
			if(a[i]<b[j])continue;//太大 
			if(a[i]==b[j])
			{
				eq=1;
				eqt=j; 
				continue;
			}
			used[j]=1;
			ans+=200;
			ok=1;
			break;
		}
		if(!ok)
		{
			for(int j=n;j;j--)
			{
				if(used[j]==2&&a[i]>b[j])
				{
					used[j]=1;
					ok=1;
					break;
				}
			}
			if(!ok)
			{
				if(eq)used[eqt]=2,ok=1;
				if(!ok)ans-=200;
			}
		}
	}
	cout<<ans;
}
posted @ 2021-09-03 18:24  lei_yu  阅读(27)  评论(0编辑  收藏  举报