洛谷 P1650 赛马

11 篇文章 0 订阅
7 篇文章 0 订阅

洛谷 P1650 赛马


题目

题目描述

我国历史上有个著名的故事: 那是在2300年以前。齐国的大将军田忌喜欢赛马。他经常和齐王赛马。他和齐王都有三匹马:常规马,上级马,超级马。一共赛三局,每局的胜者可以从负者这里取得200银币。每匹马只能用一次。齐王的马好,同等级的马,齐王的总是比田忌的要好一点。于是每次和齐王赛马,田忌总会输600银币。

田忌很沮丧,直到他遇到了著名的军师――孙膑。田忌采用了孙膑的计策之后,三场比赛下来,轻松而优雅地赢了齐王200银币。这实在是个很简单的计策。由于齐王总是先出最好的马,再出次好的,所以田忌用常规马对齐王的超级马,用自己的超级马对齐王的上级马,用自己的上级马对齐王的常规马,以两胜一负的战绩赢得200银币。实在很简单。

如果不止三匹马怎么办?这个问题很显然可以转化成一个二分图最佳匹配的问题。把田忌的马放左边,把齐王的马放右边。田忌的马A和齐王的B之间,如果田忌的马胜,则连一条权为200的边;如果平局,则连一条权为0的边;如果输,则连一条权为-200的边……如果你不会求最佳匹配,用最小费用最大流也可以啊。 然而,赛马问题是一种特殊的二分图最佳匹配的问题,上面的算法过于先进了,简直是杀鸡用牛刀。现在,就请你设计一个简单的算法解决这个问题。

输入输出格式

输入格式:
第一行一个整数n,表示他们各有几匹马(两人拥有的马的数目相同)。第二行n个整数,每个整数都代表田忌的某匹马的速度值(0 <= 速度值<= 100)。第三行n个整数,描述齐王的马的速度值。两马相遇,根据速度值的大小就可以知道哪匹马会胜出。如果速度值相同,则和局,谁也不拿钱。

【数据规模】

对于20%的数据,1<=N<=65;

对于40%的数据,1<=N<=250;

对于100%的数据,1<=N<=2000。

输出格式:
仅一行,一个整数,表示田忌最大能得到多少银币。

输入输出样例

输入样例#1:

3
92 83 71
95 87 74

输出样例#1:

200


题解

贪心(其实是可以DP的,但是DP代码写的比较长)

先排序,先比较两边最大且没参加过比赛的马的速度,再比较两边最小且没参加过比赛的马的速度,若这两种方法都不能赢,那么就用速度最小的马换对面速度最大的马

类似题目:BZOJ 1304


代码(Pascal)

var n,ans:longint;
    x,y:array[0..2005]of longint;
 procedure init;
  var i:longint;
   begin
     readln(n);
     for i:=1 to n do read(x[i]);
     for i:=1 to n do read(y[i]);
    end;
 procedure qsort(l,r:longint);
  var i,j,mid,t:longint;
   begin
     i:=l;j:=r;
     mid:=x[random(r-l+1)+l];
     repeat
       while x[i]<mid do inc(i);
       while x[j]>mid do dec(j);
       if i<=j then begin
                      t:=x[i];x[i]:=x[j];x[j]:=t;
                      inc(i);dec(j);
                     end;
      until i>j;
     if i<r then qsort(i,r);
     if l<j then qsort(l,j);
    end;
 procedure qsort1(l,r:longint);
  var i,j,mid,t:longint;
   begin
     i:=l;j:=r;
     mid:=y[random(r-l+1)+l];
     repeat
       while y[i]<mid do inc(i);
       while y[j]>mid do dec(j);
       if i<=j then begin
                      t:=y[i];y[i]:=y[j];y[j]:=t;
                      inc(i);dec(j);
                     end;
      until i>j;
     if i<r then qsort1(i,r);
     if l<j then qsort1(l,j);
    end;
 procedure main;
  var l1,l2,r1,r2:longint;
   begin
     qsort(1,n);
     qsort1(1,n);
     l1:=1;l2:=1;
     r1:=n;r2:=n;
     while (l1<=r1)and(l2<=r2) do
      begin
        if x[l1]>y[l2] then begin
                              inc(ans);
                              inc(l1);inc(l2);
                             end else
        if x[r1]>y[r2] then begin
                              inc(ans);
                              dec(r1);dec(r2);
                             end
                       else begin
                              if x[l1]<>y[r2] then dec(ans);
                              inc(l1);dec(r2);
                             end;
       end;
    end;
 procedure print;
  begin
    writeln(ans*200);
   end;
 begin
   init;
   main;
   print;
 end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
赛马实验是一种常用的实验方法,用来测量和比较不同个体、组织或系统之间的性能。这个实验的基本原理是将不同条件下的参与者分为多组,然后观察和记录它们在相同环境下的表现和成果。 在赛马实验中,我们首先需要确定实验的目的和假设。然后根据假设,选择适当的参与者和参与者的特征进行分组。每组参与者都会在相同的环境条件下进行特定任务或活动,并被记录下来。 接下来,我们会设立一个合适的时间段,以确保实验的结果具有可比性。通过收集和分析数据,我们可以比较不同组参与者的表现和成果,评估哪种条件下的参与者更出色。 赛马实验可以被广泛应用于不同领域。例如,在医学研究中,赛马实验可以用来比较不同治疗方法对患者康复的效果。在教育领域,赛马实验可以用来评估不同教学方法对学生学习成绩的影响。在市场营销中,赛马实验可以用来比较不同广告策略对销售额的影响。 通过赛马实验,我们可以得出一些有意义的结论,以便进一步改进和优化现有的条件。然而,需要注意的是,赛马实验并不一定能够完全预测实际情况,因为实验环境和条件往往与现实世界存在差异。 总之,赛马实验是一种有效的实验方法,可以用来评估和比较不同条件下的参与者的表现和成果。通过这种实验,我们可以获得有关不同条件下的相对优劣的信息,并为进一步优化和改进提供有价值的参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值