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;
}
本文来自博客园,作者:lei_yu,转载请注明原文链接:https://www.cnblogs.com/lytql/p/15224363.html