解法:第一個格子要選相鄰格子最少的,所以應該選四個角的格子。然後向格子四個角的方向延伸直到四個方向都抵達邊界。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class
Paint
{
public
:
int
getMost(
int
n,
int
m)
{
if
(m%
2
==
0
)
return
(m/
2
)*n;
else
{
int
temp1
= (m+
1
)/
2
,temp2
= (n+
1
)/
2
;
return
temp1*temp2+(m-temp1)*(n-temp2);
}
}
};
解法: 先將兩方的馬的強壯程度由小到大排序。同時遍歷我方的馬和對方的馬,若在對方的馬中能找到強壯程度低於我方當前選中的馬,則勝局數加1,且下次不再考慮對方的這匹馬,依次進行,直到任意一方的馬被遍歷完。
class
HorseRace
{
public
:
void
quickSort(vector<
int
>
&arr,
int
start,
int
end)
{
if
(start
> end)
return
;
int
i
= start,j = end;
int
base
= arr[i];
while
(i
< j) {
while
(i
< j && arr[j] >= base) j--;
if
(i
< j) {
arr[i]
= arr[j];
i++;
}
while
(i
< j && arr[i] <= base) i++;
if
(i
< j) {
arr[j]
= arr[i];
j--;
}
}
arr[i]
= base;
quickSort(arr,start,i-
1
);
quickSort(arr,i+
1
,end);
return
;
}
int
winMost(vector<
int
>
oppo, vector<
int
>
horses,
int
n)
{
int
res
=
0
;
quickSort(oppo,
0
,n-
1
);
quickSort(horses,
0
,n-
1
);
for
(
int
i
=
0
,j
=
0
;i
< n && j < n;i++) {
if
(horses[i]
> oppo[j]) {
res++;
j++;
}
}
return
res;
}
};
解法:通過列舉1、2、3、4格的情況發現,只要輪到我的時候還剩4格,我必輸無疑,因爲無論我選擇走多少格對方都可以一次走出棋盤。更巧的是,無論我走多少格,對方都可以選擇走一種格數來使這一回合湊齊4格。因此,只要總格數是4的整數倍,我就必輸無疑。而在其他任何種格數下,在走第一步的時候我都可以選擇走一種格數使得剩下的格數爲4的整數倍,這樣對方就必輸無疑。
class
Jump
{
public
:
int
checkWin(
int
n)
{
if
((n-
1
)%
4
==
0
)
return
0
;
else
return
1
;
}
};
解法:畫圖找規律,從一維推廣到二維。用1表示A勝,0表示B勝。
①當矩陣只有一行或一列時,偶數格A勝,奇數格B勝。
0
|
1
|
0
|
1
|
0
|
1
|
1
|
|
|
|
|
|
0
|
|
|
|
|
|
1
|
|
|
|
|
|
0
|
|
|
|
|
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
1
|
|
|
|
|
0
|
|
|
|
|
|
1
|
|
|
|
|
|
0
|
|
|
|
|
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
0
|
1
|
0
|
1
|
0
|
1
|
class
Game
{
public
:
char
getWinner(
int
n,
int
m)
{
vector<vector<
int
>
> dp(n,vector<
int
>(m));
for
(
int
i
=
0
;i
< n;i++) {
for
(
int
j
=
0
;j
< m;j++) {
if
(i
==
0
)
dp[i][j]
= j%
2
==
0
?
0
:
1
;
else
{
if
(j
==
0
)
dp[i][j]
=
1
^dp[i-
1
][j];
else
{
dp[i][j]
=
1
^(dp[i-
1
][j]&dp[i-
1
][j-
1
]&dp[i][j-
1
]);
}
}
}
}
return
dp[n-
1
][m-
1
]
==
1
?
'A'
:
'B'
;
}
};
public
class
Game
{
public
char
getWinner(
int
n,
int
m)
{
if
((n
%
2
==
1
)
&& (m %
2
==
1
))
return
'B'
;
return
'A'
;
}
}