1. 程式人生 > >[BZOJ3701]N皇後

[BZOJ3701]N皇後

scan n) amp 所有 span .cn main clas png

哈哈哈水題~

但是不能一眼看出來的。。我想了一個小時?!


題面

Description

“國際象棋中,一方的皇後數不能超過5個” 一個N*N的棋盤,任意擺放皇後,最壞情況下最少需要多少個皇後才能保證所有的格子都被攻擊到。

Input

多組數據 第一行一個整數,數據組數T 接下來T行,每行一個正整數N

Output

每組數據輸出一行一個整數表示答案。

Sample Input

1
3

Sample Output

3

HINT

100%的數據,N<=50,T<=25


真坑啊。。被數據範圍騙了。。差點寫了深搜。

然而事實是:

對於任意一個點A,這個地方放上皇後,A所能覆蓋的點放上皇後也能覆蓋A。

而A覆蓋不了的點放上皇後怎麽也覆蓋不了A。

所以最優的方案就是,先在這些覆蓋不了的點上全都放上皇後,最後就會只剩一個A沒有覆蓋,再怎麽放A都要被覆蓋了。

如下圖

技術分享

對於任意的A,紅圈再加上隨便一個位置就是要放的地方。

可以證明這個A取四個角的時候不能覆蓋點最多。即答案最大。

所以答案就是n*n-n*3+3了。

代碼簡直智障。

1 #include<cstdio>
2 int main(){
3     int t;scanf("%d",&t);
4     while(t--){
5         int n;scanf("%d",&n);
6         printf("
%d\n",n*(n-3)+3); 7 } 8 }

寫這個題解主要是網上沒有,怕這破題坑人啊哈

[BZOJ3701]N皇後