bzoj 1034 伪田忌赛马

本文介绍了一种基于田忌赛马策略的比赛得分优化方法,通过排序和匹配对手的策略来最大化自己的得分。文章提供了详细的步骤说明及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实,它就是田忌赛马的那个套路=。=

能赢不平,能平不输

先都排序,

然后小的能赢就让它赢,小的赢不了的话就去看大的,大的能赢就赢呗=。=

然后小的也赢不了大的也也不了就让小的输给他一个大的(注意判断一下平局)反正小的也没用,大的还可以赢

得出最大得分=。=
易知,无论双方输赢如何,n局的双方总得分是一定的即2*n 分,所以最小的分=2*n-对方最大得分
var
    n,ans               :longint;
    i,j,k,l             :longint;
    a,b                 :array[0..100010] of longint;
procedure sort1(l,r:longint);
var
         i,j,x,y: longint;
begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while a[i]<x do inc(i);
           while x<a[j] do dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then sort1(l,j);
         if i<r then sort1(i,r);
end;
//
procedure sort2(l,r:longint);
var
         i,j,x,y: longint;
begin
         i:=l;
         j:=r;
         x:=b[(l+r) div 2];
         repeat
           while b[i]<x do inc(i);
           while x<b[j] do dec(j);
           if not(i>j) then
             begin
                y:=b[i];b[i]:=b[j];b[j]:=y;
                inc(i);j:=j-1;
             end;
         until i>j;
         if l<j then sort2(l,j);
         if i<r then sort2(i,r);
end;

begin
   read(n);
   for i:=1 to n do read(a[i]);
   for i:=1 to n do read(b[i]);
   sort1(1,n);
   sort2(1,n);
   //
   i:=1;j:=1;l:=n;k:=n;ans:=0;
   while (i<=l) and (j<=k) do
   begin
      if (a[i]>b[j]) then
      begin
         inc(i);inc(j);inc(ans,2);
      end else
      if (a[l]>b[k]) then
      begin
         dec(l);dec(k);inc(ans,2);
      end else
      begin
         if (a[i]=b[k]) then inc(ans);
         inc(i);dec(k);
      end;
   end;
   write(ans,' ');
   //
   ans:=0;
   i:=1;j:=1;l:=n;k:=n;
   while (i<=l) and (j<=k) do
   begin
      if (b[j]>a[i]) then
      begin
         inc(ans,2);inc(i);inc(j);
      end else
      if (b[k]>a[l]) then
      begin
         inc(ans,2);dec(l);dec(k);
      end else
      begin
         if b[j]=a[l] then inc(ans);
         inc(j);dec(l);
      end;
   end;
   writeln(2*n-ans);
end.
——by Eirlys
转载请注明出处=w=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值