bzoj 1034 泡泡堂|贪心

本来一看题上的图片以为是一道大模拟,谁知和泡泡堂一点关系没有

加了平局的田忌赛马问题。

如果能赢,就用最弱的打最弱的,最强的打最强的,如果都赢不了,就让最弱的去打最强的,能怎么样就怎么样。可以证明这样贪心是对的

1、用最弱的去赢最弱的显然没有问题

2、用最强的去赢最强的也很好,否则这些也干不了别的

3、用最弱的去打最强的,在最强的打最强的之后,留下的是尽量弱的,也就最大化了平局的可能,而且,使己方保留尽量强的选手,对方保留尽量弱的选手。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>

#define md
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N 100010
using namespace std;
int a[N],b[N];
int n;
int solve(int a[],int b[])
{
 int ans=0;
 int l1=1,r1=n,l2=1,r2=n;
 while (l1<=r1&&l2<=r2)
 {
  if (a[l1]>b[l2]) { ans+=2; l1++; l2++;}
  else if (a[r1]>b[r2]) { ans+=2; r1--; r2--;}
  else { ans+=a[l1]==b[r2]; l1++; r2--;}
 }
 return ans;
}

int main()
{
 scanf("%d",&n);
 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
 for (int i=1;i<=n;i++) scanf("%d",&b[i]);
 sort(a+1,a+n+1); sort(b+1,b+n+1);
 int ans1=solve(a,b),ans2=solve(b,a);
 printf("%d %d\n",ans1,2*n-ans2);
 return 0;
}


你可能感兴趣的:(bzoj 1034 泡泡堂|贪心)