一、 涂色问题
题目:你要在一个nxm的格子图上涂色,你每次可以选择一个未涂色的格子涂上你开始选定的那种颜色。同时为了美观,我们要求你涂色的格子不能相邻,也就是说,不能有公共边,现在问你,在采取最优策略的情况下,你最多能涂多少个格子?
给定格子图的长n和宽m。请返回最多能涂的格子数目。
思路:这个问题就很简单啦,当n*m为奇数的时候返回n*m/2+1,当为偶数的时候返回n*m/2
class Paint {
public:
int getMost(int n, int m) {
if(n*m%2==1)
return n*m/2+1;
return n*m/2;
}
};
二、 赛马问题
直接上代码
class HorseRace {
public:
int winMost(vector<int> oppo, vector<int> horses, int n) {
sort(oppo.begin(),oppo.end());
sort(horses.begin(),horses.end());
int res=0;
int k=0;
for(int i=0;i<oppo.size();i++)
for(int j=0;j<oppo.size();j++){
if(oppo[i]<horses[j]&&j>k){
res++;
k=j;
break;
}
}
return res;
}
};
三、 跳格子问题
题目:你和你的朋友正在玩棋子跳格子的游戏,而棋盘是一个由n个格子组成的长条,你们两人轮流移动一颗棋子,每次可以选择让棋子跳1-3格,先将棋子移出棋盘的人获得胜利。我们知道你们两人都会采取最优策略,现在已知格子数目,并且初始时棋子在第一格由你操作。请你计算你是否能获胜。
给定格子的数目n(n为不超过300的正整数)。返回一个整数,1代表能获胜,0代表不能获胜。
思路:最优策略是,剩下4个格子,让对方先走,自己肯定能赢
class Jump {
public:
int checkWin(int n) {
if((n-1)%4==0)
return 0;
return 1;
}
};
四、 游戏问题
题目:A与B做游戏。 在一个n*m的矩阵中的出发点是(1,m),终点是(n,1),规则是只能向左移动一格,向下一格或向左下移动一格,先走到终点的为winner。 A先走。
给定两个整数n和m,请返回最后的获胜者的名字(A或B)。
思路:最优策略是两个人每次都是走两格,因为是A先走,那么m*n%2==0的情况是A赢,否则B赢
class Game {
public:
char getWinner(int n, int m) {
if(n*m%2==0)
return 'A';
return 'B';
}
};
五、 数组清空练习
题目:现在有一个整数数组,其元素值均为1-n范围内的某个整数,现在你和你的朋友在玩一个游戏,游戏的目的是把数组清空,你们轮流操作,你是先手,每次操作你可以删除数组中值为某个数的元素任意多个(当然数组中值为这个数的元素个数应大于等于你删除的个数,且你至少要删除一个数)。最先把数组清空的人获得胜利。假设你们都采取最优策略,请你计算你能否获得胜利。
给定一个整数数组A和元素个数n。请返回一个整数,1代表你能获胜,0代表你不能获胜。
这道题思路不太懂,什么情况下A能获胜,有人理解的话可以留言
class Clear {
public:
int getWinner(vector<int> A, int n) {
int res=0;
map<int,int> m;
for(int i=0;i<n;i++)
m[A[i]]++;
for(int i=0;i<n;i++){
res^=m[A[i]];
m[A[i]]--;
}
return res!=0;
}
};