【問題描述】
在非常緊張的 noip 考試中,有人喜歡啃指甲,有人喜歡轉鉛筆,有人喜歡撕 紙條,……而小 x 喜歡迷摺紙。
現有乙個 w * h 的矩形紙張,監考老師想知道,小 x 至少要折多少次才能使 矩形紙張變成 w * h 的矩形紙張。
注意,每次的摺痕都要平行於紙張的某一條邊。
【輸入格式】
第一行包括兩個整數 w,h。
第二行包括兩個整數 w,h。
【輸出格式】
輸出乙個整數,表示至少需要折的次數。若無解,則輸出-1。
【輸入輸出樣例】
input1
input2
input3
2 72 2
5 51 6
10 6
4 8output1
output2
output32-1
2【資料說明】
對於 20% 的資料滿足:w = w 且 h,h≤3。
對於 100% 的資料滿足: 1 ≤ w,h,w,h ≤ 9 10 。
先從錯誤中得出正確結論
#includeusingnamespace
std;
intw,h,w,h;
int func(double a,int
b)int
main()
cout
return0;
}//29808 20197
//1900 28433
首先,想想有沒有不可能折成的情況
如果乙個目標寬度比最大的還大,那就不可能折成。輸出"-1"。
接著,把四個輸入數按ww,hh或者是wh,hw這樣對應,
目的是模擬兩種摺疊方式,即是把w折成w,h折成h還是把w折成h,h折成w。
最後兩種方式中取最小值即可。
再來看函式cout
乙個邊界條件
如果當前的目標寬度(b)大於或等於當前寬度(a)//好像應該是等於吧?不會大於了if(b>=a) return 0;
就不用再折了。返回0;
應該問題就在這裡吧?
我們只考慮要排除了「乙個目標寬度比最大的還大」這種情況
要讓特判更全面
不妨讓判斷全在裡面
再用返回值inf來判斷可不可以折成。
#includeusingnamespace
std;
intw,h,w,h;
int func(double a,int
b)int
main()
cout
return0;
}//這裡是我開始錯了的一種情況
//29808 20197
//1900 28433
//答案:5
//錯誤答案:4
ok!
嵊州D6T2 城市 city
眾所周知,why 是czyz 王國的國王。czyz 王國一共有n 個城市,每個城市都有一條道路連向乙個城市 可能連向這個城市自己 同時,對於每乙個城市,也只有一條道路連向它。如果乙個人可以通過道路可以從城市x 走向城市y,那麼我們稱 x,y 這 個數對是滿足條件的。x 可以等於y 現在why 可以選...
嵊州普及Day2T2
題意 對於n個數的數列,進行排列,求第m個大於此數列的數列。思路 查詢後2個是否逆序,若是,將後3個遞迴。如此運算,找後面大於此數中最小數交換,然後將後面數列順序排列。相對簡單。見 include include include include include using namespace std...
嵊州D4T2 硬幣 有人來教教我嗎!
卡拉贊的展覽館被入侵了。展覽館是一條長長的通道,依次擺放著 n 個展櫃 從西到東編號依次 為 1 n 入侵者瑪克扎爾在第 n 個展櫃東邊召喚了乙個傳送門,一共施放了 n 次法術,每一次會選取乙個展櫃,並在那個展櫃裡召喚乙隻小鬼,小鬼被生成前該展櫃裡的展品會被自動轉移 除此以外不能取出展品 作為展覽館...