你要在一个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)