【洛谷 P2587】[ZJOI2008]泡泡堂

贪心
先将两队从大到小分别排序。

1.如果我方最强的可以击败敌方最强的,换句话说,我方最强的是无敌的,既然一定会赢,那就拖走一个敌方最强的,正确性显然。

2.如果我方最弱的都能赢对方最弱的,说明对方最弱的一定会输,换句话来说我方任何一个都能战胜对方最弱的,为了保证我方剩下的更强,我们就用消耗最弱的去打对方最弱的,正确性显然。

先忽略一下平局这种可能。

3.如果敌方最弱的不是来卖萌的(强于我方最弱的),而且敌方最强的是无敌的。换句话说,我方一定会输一局。那么就选择让我方最弱的去和敌方最强的去打(田忌赛马的故事大家都看过吧),让输的利用价值更大。
PS:
因为存在平局的可能,当对方最弱的和我方最弱的平局时……
有两种情况:
1.
这时已知我方最强的弱于对方最强的(不然不会轮到比较最弱的)。那么至少输一次。本着让输的价值更大得原则,让我方最弱的去消耗对方最强的,让输的这一次价值更大,这样的话,一定会更优。
2.
我方最强的与对方最强的平局。那对方最强的至少会阻止我方得一分。因为我方最弱的最多得一分的话,不如让我方最弱的去打对方最强的,而阻止它阻止我们得分,这样对于总分是不会变化的,并且使得我方最弱的更强。
我方 2 4 5 7
敌方 2 3 6 7
所以平局时让我方最弱打敌方最强会更优。

总结一下代码怎么打:
如果我队最强的能战胜对方最强的,就让这两者作战。
如果我队最弱的能战胜对方最弱的,就让这两者作战。
如果上述都不符合,就让我队最弱的去和对方最强的作战。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans=0,ans1=0;
int a[1000005],b[1000005],c[1000005];
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+1+n);
      sort(b+1,b+1+n);

      int l1=1,l2=1,r1=n,r2=n;
      for(int i=1;i<=n;i++)
      {
        if(a[r1]>b[r2])
        {
            ans+=2;
            r1--;
            r2--;
        }
        else if(a[l1]>b[l2])
        {
            ans+=2;
            l1++;
            l2++;
        }
        else 
        {
            if(a[l1]==b[r2]) ans+=1;
            else if(a[l1]<b[r2]) ans+=0;
            l1++;
            r2--;
        }
      }
      cout<<ans;

      l1=1,l2=1,r1=n,r2=n;
      for(int i=1;i<=n;i++)
      {
        if(b[r2]>a[r1])
        {
            ans+=2;
            r2--;
            r1--;
        }
        else if(b[l2]>a[l1])
        {
            ans+=2;
            l2++;
            l1++;
        }
        else 
        {
            if(b[l2]==a[r1]) ans1+=1;
            else if(b[l2]<a[r1]) ans1+=2;
            l2++;
            r1--;
        }
      }
      cout<<' '<<ans1;
      return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值