題目:在 n 條水平線與 m 條豎直線構成的網格中,放 k 枚石子,每個石子都只能放在網格的交叉點上。問在最優的擺放方式下,最多能找到多少四邊平行於座標軸的長方形,它的四個角上都恰好放著一枚石子。
輸入:輸入檔案包含多組測試資料。第一行,給出乙個整數t,為資料組數。接下來依次給出每組測試資料。每組資料為三個用空格隔開的整數 n,m,k。
輸出:對於每組測試資料,輸出一行"case #x: y",其中x表示測試資料編號,y表示最多能找到的符合條件的長方形數量。所有資料按讀入順序從1開始編號。
33 3 8
4 5 13
7 14 86
樣例輸出
case #1: 5case #2: 18
case #3: 1398
剛開始看著題目的時候,沒有想法,就單單ac了傳話遊戲那題;今天在網上看了看別人的思路,發覺其實類似於上週微軟筆試那道3*4矩陣中有多少個矩形的題目,恍然大悟;
思路: **
首先先考慮對於乙個布滿點的矩形(x行,y列),所有的矩形總數為 c(2,x)*c(2,y)。要使數量最多,則x和y要盡可能接近(有最大行和最大列的限制)。題中所給的k可能不能剛好排成大矩形,可能有多餘的幾個點,這幾個點的數量一定不會超過一行或一列的最大數量。 試想如果超過,則多出來完整的一行或一列可以和原來的大矩形構成更大的矩形,剩下的點就不能構成完整的一行或一列了。
多餘多出來的點,以一排或一列的形式,靠在大矩形短的一邊(要注意是否到達邊界),設多餘k個點,則多增加的矩形數為 c(2,k)*l (l為長邊的點數)。
上**:沒有提交過,不曉得對錯,自己測試了幾組資料是對的;
#include #include using namespace std;
int getnrec(int x)
void main()
width = temp>m?m:temp;
length = (k/width)>n?n:(k/width);
remain = k - width*length;
res = getnrec(width-1)*getnrec(length-1);
cout <<"case #"<<++pq<<": ";
if(remain >= 2)
else
}cout <}
}
看看有沒有熱心網友大牛,分析下對不對啊~~
程式設計之美2013 資格賽第二題 長方形
長方形 時間限制 1000ms 記憶體限制 256mb 在 n 條水平線與 m 條豎直線構成的網格中,放 k 枚石子,每乙個石子都僅僅能放在網格的交叉點上。問在最優的擺放方式下,最多能找到多少四邊平行於座標軸的長方形,它的四個角上都恰好放著一枚石子。輸入檔案包括多組測試資料。第一行,給出乙個整數t,...
2013程式設計之美資格賽總結
終於可以完成乙個程式比賽的題目了,雖然這次的時間有些長。這是第一次完成,感到真心不錯。廢話不說了,下面說一下這次程式設計之美預選賽的情況。當我在凌晨看到這三個題目時,感覺第乙個還有希望,第二個一點思路沒有,第三個不敢期望。第乙個是詞對變換,感覺不太難。第二道是一種.怎麼說呢,反正是一點思路沒有。第三...
2013程式設計之美 資格賽 總結
今天院裡辦的籃球賽小組賽中與結束了,在眾多給力同學的努力下,我們班總算是沒有以全負戰績收場,身為組織者的我也終於可以鬆口氣了。今天敲不動 了,總結一下最近的題目吧。資格賽的三道題都有些想法,但只對了第一題 看了別人的題解之後發現第二題細節沒有處理好,思路大方向是對的,第三題我的出發點貌似就不對。看題...