嵊州D5T2 摺紙 folding

2022-05-31 15:39:10 字數 1493 閱讀 8518

【問題描述】

在非常緊張的 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 。

先從錯誤中得出正確結論

#includeusing

namespace

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
再來看函式

乙個邊界條件

if(b>=a) return 0;

如果當前的目標寬度(b)大於或等於當前寬度(a)//好像應該是等於吧?不會大於了

就不用再折了。返回0;

應該問題就在這裡吧?

我們只考慮要排除了「乙個目標寬度比最大的還大」這種情況

要讓特判更全面

不妨讓判斷全在裡面

再用返回值inf來判斷可不可以折成。

#includeusing

namespace

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 次法術,每一次會選取乙個展櫃,並在那個展櫃裡召喚乙隻小鬼,小鬼被生成前該展櫃裡的展品會被自動轉移 除此以外不能取出展品 作為展覽館...