hdu-1052-Tian Ji -- The Horse Racing(经典)

来源:互联网 发布:奥鹏网络研修总结作业 编辑:程序博客网 时间:2024/04/30 02:07

点击打开链接

题意:田忌赛马解题报告:关键在于田忌最慢的马,能先赢就先赢,不能赢就去消耗齐王最快的马,然后再来考虑最快的马,能先赢就先赢,不能赢说明现在田忌和齐王最快的马和最慢的马都相等,再来考虑把田忌最慢的马和齐王最快的马比较。可能更小,但也可能相等。(要按顺序哦,亲。)1.当田忌最慢的马比齐王最慢的马快,赢一场先2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场3.当田忌最快的马比齐王最快的马快时,赢一场先。4.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。5.当田忌最快的马和齐王最快的马相等时,拿最慢的马来和齐王最快的马比.//以下是网上的证明证明:田忌最快的马和齐王最快的马相等时拿最慢的马来和齐王最快的马比有最优解。1)假设他们有n匹马,看n=2的时候.a1 a2b1 b2因为 田忌最快的马和齐王最快的马相等 所以a1=b1,a2=b2 所以这种情况有2种比赛方式,易得这两种方式得分相等。2)当数列a和数列b全部相等等时(a1=b1,a2=b2...an=bn),显然最慢的马来和齐王最快的马比有最优解,可以赢n-1长,输1场,找不到更好的方法了。3)当数列a和数列b元素全部相等时(a1=b1=a2=b2...=an=bn),无法赢也不输。现在假设n匹马时拿最慢的马来和齐王最快的马比有最优解,证明有n+1匹马时拿最慢的马来和齐王最快的马比也有最优解。数列a1 a2 a3 a4...an an+1b1 b2 b3 b4...bn bn+1其中ai>=ai-1,bi>=bi-1数列a和数列b不全部相等时,拿最慢的马来和齐王最快的马比数列得到数列(a1) a2 a3 a4...an an+1b1 b2 b3 b4...bn (bn+1)分4种情况讨论 1.b1=b2,an=an+1则有a2 a3 a4...anb2 b3 b4...bn其中a2>=a1,a1=b1,b1=b2,得a2>=b2(此后这种大小关系不再论述),an>=bn.此时若a2=b1,根据归纳假设,有最优解,否则a2>根据前面“公理”论证有最优解。当且仅当a数列,b数列元素全部相等时有an+1=b1,已证得,所以an+1>b1,赢回最慢的马来和齐王最快的马比输的那一场。2.b1<=b2,an=an+1交换 b1,b2的位置,数列(a1) a2 a3 a4...an an+1b2 b1 b3 b4...bn (bn+1)此时 a2>=a1,an>=bn,对于子表a2 a3 a4...anb1 b3 b4...bn根据前面“公理”或归纳假设,有最优解。an+1>=b2, 当且仅当b2=b3=b4=..=bn+1时有an+1=b2,这种情况,a中其它元素<=b1,b2,b3,b4..bn,对于这部分来说,能赢 x盘(x<=n),假如不拿最慢的马来和齐王最快的马比则拿最快的马来和齐王最快的马比,此时平一盘,能赢x-1盘,而拿最慢的马来和齐王最快的马 比,输一盘能赢x盘,总的来说,还是X这个数,没有亏。3.b1=b2,an<=an+14.b1<=b2,an<=an+1证明方法类似,不再重复。以证得当有n+1匹马的时候,田忌和齐王最快最慢的马速度相等时,拿最慢的马来和齐王最快的马比有最优解,已知当n=2时成立,所以对于n>2且为整数(废话,马的只数当然是整数)时也成立。当n=1时....这个似乎不用讨论


<div><div>#include <stdio.h>  #include <algorithm>  using namespace std;  int T[1002],K[1002],n,win,lose;  void read()  {      for(int i=0;i<n;i++)          scanf("%d",&T[i]);      for(int i=0;i<n;i++)          scanf("%d",&K[i]);      sort(T,T+n);      sort(K,K+n);  }  void race()  {      win = lose =0;      int t_slow=0,t_fast=n-1;      int k_slow=0,k_fast=n-1;      while(t_slow <= t_fast)      {          if(T[t_slow] > K[k_slow])        //情况1          {              win++;              t_slow++;              k_slow++;          }          else if(T[t_slow] < K[k_slow])   //情况2          {              lose++;              t_slow++;              k_fast--;          }          else                             //情况3          {              if(T[t_fast] > K[k_fast])    //先别放水,让哥比完这场              {                  win++;                  t_fast--;                  k_fast--;              }              else                         //1、2、3、放              {                  if(T[t_slow] < K[k_fast])//哥不一定会输哦~~~                      lose++;                  t_slow++;                  k_fast--;              }          }      }  }  int main()  {      //freopen("1","r",stdin);      //freopen("2","w",stdout);      while(scanf("%d",&n),n)      {          read();          race();          printf("%d\n",200*(win-lose));      }      return 0;  }</div><div>  </div></div>



0 0
原创粉丝点击