一些智力题

(1)

你要在一个nxm的格子图上涂色,你每次可以选择一个未涂色的格子涂上你开始选定的那种颜色。同时为了美观,我们要求你涂色的格子不能相邻,也就是说,不能有公共边,现在问你,在采取最优策略的情况下,你最多能涂多少个格子?给定格子图的长n和宽m。请返回最多能涂的格子数目。

思路:

按照对角线涂色,可知格子的一半能够涂上颜色。

public class Paint {
    public int getMost(int n, int m) {
        // write code here
        int res = (n*m+1)/2;
        return res;
    }
}

(2)

作为一个马场的主人,你要安排你的n匹赛马和另一个马场的n匹马比赛。你已经知道了对方马场的出战表,即参加每一场的马的强壮程度。当然你也知道你自己的所有马的强壮程度。我们假定比赛的结果直接由马的强壮程度决定,即更壮的马获胜(若相同则双方均不算获胜),请你设计一个策略,使你能获得尽量多的场次的胜利。

给定对方每场比赛的马的强壮程度oppo及你的所有马的强壮程度horses(强壮程度为整数,且数字越大越强壮)同时给定n,请返回最多能获胜的场次。

思路:

public class HorseRace {
    public int winMost(int[] oppo, int[] horses, int n) {
        // write code here
        sort(oppo,n);//对双方战马实力排序
        sort(horses,n);
        
        int j=n-1; 
        int count=0;
        for(int i=n-1;i>=0;i--){//从后开始往前比较
            if(oppo[i]<horses[j]){
                count++;
                j--;
            }
        }
        return count;
    }
    
    public void sort(int[] a,int n){
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-1-i;j++){
                if(a[j]>a[j+1]){
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }
    }
}

(3)

你和你的朋友正在玩棋子跳格子的游戏,而棋盘是一个由n个格子组成的长条,你们两人轮流移动一颗棋子,每次可以选择让棋子跳1-3格,先将棋子移出棋盘的人获得胜利。我们知道你们两人都会采取最优策略,现在已知格子数目,并且初始时棋子在第一格由你操作。请你计算你是否能获胜。

思路:

因为目前你已经在第一格,所以剩下n-1个格子。那么如果这个格子是4的倍数,先走的肯定输(不管你跳1~3那几步,都会让对方再跳一次)

所以直接 return (n-1)%4==0?false:true


(4)

A与B做游戏。 在一个n*m的矩阵中的出发点是(1,m),终点是(n,1),规则是只能向左移动一格,向下一格或向左下移动一格,先走到终点的为winner。 A先走。

给定两个整数n和m,请返回最后的获胜者的名字(A或B)。

public class Game {
    public char getWinner(int n, int m) {
        // write code here
         最优策略是两个人每次共走2格,
        // 如果A向左下2移动一格,相当于移动2格,此时B也应该向左下移动,总共是4格
         if(m%2!=0 && n%2!=0)
            return 'B';// // 此时B距离终点只有1格
        else
            return 'A';
    }
}

(5)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值