题目描述:
输入输出:
解释:
本题为贪心思想,找出所有的情况即可。
1)对田忌和国王的马都从小到大排序;
2)如果田忌最快的马 > 国王最快的马, 则让它们比赛(因为这种情况下,田忌最快的马对国王所有的马都能赢,肯定是耗掉国王最快的马对田忌剩余的马最有优势)
3)如果田忌最快的马 < 国王最快的马, 则让田忌最慢马与国王最快的马比赛(因为这种情况下,田忌所有的马对国王最快的这匹马都会输,反正要输一场,用田忌最慢的马去输,肯定对田忌剩余的马最有优势)
4)如果田忌最快的马 == 国王最快的马,则 比较 最慢的马,
(1)如果田忌的更慢,肯定还是用最慢的马 去耗国王最快马
(2)如果田忌的更快,说明田忌所有的马都能赢国王最慢的马, 让田忌最慢的马去赢,保留更 快的马,对之后比赛更有优势
(3)如果一样快,让 最慢去耗 国王最快马。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int n;
int a[N],b[N];
int main()
{
int i;
int ans=0;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<n;i++) scanf("%d",&b[i]);
sort(a,a+n),sort(b,b+n);
int l1=0,r1=n-1;//田
int l2=0,r2=n-1;//齐
while(l1<=r1&&l2<=r2)
{
if(a[r1]>b[r2])
{
ans+=200;
r1--;
r2--;
}
else if(a[r1]<b[r2])
{
ans-=200;
l1++;
r2--;
}
else//两者最快的相同
{
if(a[l1]>b[l2])
{
ans+=200;//最慢的两个比
l1++;
l2++;
}
else if(a[l1]<b[l2])
{
ans-=200;//田的最慢比齐的最快
l1++;
r2--;
}
else if(a[l1]==b[l2])//最慢的也相等,让田最慢的比齐最快的
{
if(a[l1]<b[r2])//在最快的==最快的,最慢的=最慢的情况下
ans-=200;//需要确保最慢的马是严格小于(不等于)最快的马
//只有在最慢的马小于最快的马的时候需要-200,若最快的马==最慢的马,说明是平局
l1++;
r2--;
}
}
}
printf("%d\n",ans);
return 0;
}
写在最后: 文章多有不足,代码也不一定简洁,欢迎各位大佬指正!