杭电1052

本文详细解析了田忌赛马问题的算法实现,通过排序和贪心策略确定最佳匹配方案,以最大化获胜次数。
import java.util.Scanner;
import java.util.Arrays;

public class Main
{
       private int[] tian;
       private int[] king;
       private int n;
       private int m;     //田劲赢的钱        
       Main( int n )
       {
             this.tian = new int[n];
             this.king = new int[n];
             this.n = n;
             this.m = 0;
       }
       public void setT( int i,int a )
       {
              this.tian[i] = a;
       }
       public void setK( int i,int b )
       {
              this.king[i] = b;
       }

       

       public void sort()
       {
              Arrays.sort( this.tian );
              Arrays.sort( this.king );
       }

       public void setM()
       {
              int[] c = new int[n];
              for( int i=0;i<n;i++ )
              {
                   c[i] = 0;
              }
              int j=0;               //j指的是国王还没比的马里面最差的
              int k=this.n-1;        //k指的是国王还没比的马里面最好的
              int l=this.n-1;        //l指的是田忌目前好的马
              for( int i=0;i<=l; )
              {                  
                        if( tian[i]<king[j] )       //田忌的马比不上国王的马,就让那匹烂的马去对抗国王最好的马
                        {
                            m--;
                            k--;
                            i++;
                        }
                        else
                        {
                            if( tian[i]==king[j] )       //2匹马能力相同的情况下,这里比较蛋疼
                            {
                                if( tian[l]>king[k] )      //如果田忌最好的马的能力比国王的马好,就把田忌最好的马去和国王最好的马比赛,烂的马先别比赛
                                {
                                    m++;
                                    l--;
                                    k--;
                                }
                                else
                                {
                                    if( tian[i]<king[k] )     //如果田忌最好的马比不上国王最好的马,就让田忌最差的马去和国王最好的马比赛
                                    {
                                        m--;
                                        i++;
                                        k--;
                                    }
                                    else                    //这里是最极端的一种可能,在国王和田忌都剩下最后一匹马比赛,并且这两匹马打和的时候,这样做可以结束循环。
                                    {                       //这里跟网上的有点不同吧,是我个人的意见,或者我想错了,大家有什么见解,都可以提出来。
                                        i++;          
                                        k--;
                                    }
                                }
                            }
                            else
                            {
                                if( tian[i]>king[j] )          //田忌的马比国王的马,直接秒杀
                                {
                                    m++;
                                    j++;
                                    i++;
                                }
                            }
                        }                
              }

           
                   
       }
     
      public void prM()
      {
            System.out.println( this.m*200 );
      }
    
       public static void main(String[] args)
       {
              int n;
              Scanner cin = new Scanner(System.in);
              n = cin.nextInt();
              int a;
              while( n!=0 )
              {
                   Main m = new Main( n );
                   for( int i=0;i<n;i++ )
                   {
                        a = cin.nextInt();
                        m.setT( i,a );
                   }
                   for( int i=0;i<n;i++ )
                   {
                        a = cin.nextInt();
                        m.setK( i,a );
                   }
                   m.sort();
                   m.setM();
                   m.prM();
                   n = cin.nextInt(); 
              }
       }
}


先发下代码吧。

 始终要参考网上大神的代码,才能够。真够水的。

先说一下这道题目的思路吧。

这道题目,要做到:

1、如果田忌的某匹马相对于国王的马来说,是差的。那么它的最大价值化的方法是在拿它去和国王相对最好的马PK时,反正都是输嘛。

2、如果田忌的某匹马相对于国王的马来说,是好的。那么它的最大价值化的方法是在拿它去和国王的相对最好的马PK并且能胜利的时候,搞定最强的,给下面的小弟更多的机会。

3、如果田忌的某匹马相对于国王的马来说,是打和的。那么当田忌目前最好的马和国王目前最好的马PK,并且田忌的马取得胜利时,就让田忌最好的马去PK国王最好的马。如果田忌不能胜利的时候,就拿田忌打平的马去和国王最好的马PK,然后,就搞掉了最好的马。(有一点要注意,在这么搞的时候,如果到最后剩一匹马,并且打平的时候,要注意能够结束循环。  纯属个人意见,不喜勿喷。。。。)

这就是主要的解题思路和思想,貌似就是贪心算法吧。

我觉得我个人在寻找这种思路和归纳这种思路的能力很差,以后要好好提高啊。。。。。

【源码免费下载链接】:https://renmaiwang.cn/s/nhrcw 深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法,它选择一个节点并尽可能深地探索其分支。在迷宫生成中,DFS被用来创建复杂的路径结构。以下是对给定内容的详细解释:1. **Python深度优先算法生成迷宫的原理**: 迷宫生成的基本思想是随机地在空白区域添加墙壁,形成一条可以从起点到终点的路径。DFS在这里的作用是从起始点开始,随机选择一个方向进行移动,并将该路径标记为已访问。当遇到障碍(已存在的墙壁)或者到达终点时,算法回溯到上一步,选择其他未尝试过的路径。2. **代码解析**: - 定义矩阵`dfs`来记录迷宫中每个单元格是否已被访问。 - 定义矩阵`maze`来表示最终生成的迷宫,其中`#`代表墙壁,空格代表可通行路径。 - `operation`字典存储了四个可能的方向(上、下、左、右)对应的坐标偏移量。 - `direction`列表包含所有可能的方向,用于随机选择移动方向。 - `stack`用于存储深度优先搜索过程中的路径。3. **函数说明**: - `show(graph)`:打印迷宫矩阵,便于观察迷宫结构。 - `showRouter(stack)`:打印DFS过程中访问的路径,展示从起点到终点的路径。 - `generateMaze(start)`:核心函数,使用DFS生成迷宫。首先将起始点标记为已访问,然后随机排序方向,依次尝试这些方向,如果新位置未被访问且在有效范围内,则打通墙壁并递归调用自身。4. **迷宫生成流程**: - 创建一个全墙的初始迷宫矩阵,奇数行和奇数列的位置代表实际的墙壁,偶数位置代表路径。 - 起点设为`(0, 0)`,调用`generateMaze((0,0))`开始生成迷宫。 - 在递归过程中,每次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值