嵊州D5T2 折纸 folding
折紙 folding
【問題描述】
在非常緊張的 NOIP 考試中,有人喜歡啃指甲,有人喜歡轉鉛筆,有人喜歡撕 紙條,……而小 x 喜歡迷折紙。
現有一個 W * H 的矩形紙張,監考老師想知道,小 x 至少要折多少次才能使 矩形紙張變成 w * h 的矩形紙張。
注意,每次的折痕都要平行于紙張的某一條邊。
【輸入格式】
第一行包括兩個整數 W,H。
第二行包括兩個整數 w,h。
【輸出格式】
輸出一個整數,表示至少需要折的次數。若無解,則輸出-1。
【輸入輸出樣例】
| Input1 | Input2 | ?Input3 |
| 2 7 2 2 | 5 5 1 6 | 10 6 4 8 |
| Output1 | Output2 | Output3 |
| 2 | -1 | ?2 |
【數據說明】
對于 20% 的數據滿足:W = w 且 H,h≤3。
對于 100% 的數據滿足: 1 ≤ W,H,w,h ≤ 9 10 。
Solve
?先從錯誤中得出正確結論
#include<bits/stdc++.h> using namespace std; int W,H,w,h; int func(double a,int b){if(b>=a) return 0;if(b>=a/2.0) return 1;return func(a/2.0,b)+1; } int main(){ // freopen("folding.in","r",stdin); // freopen("folding.out","w",stdout);cin>>W>>H>>w>>h;//特判 //如果一個目標寬度比最大的還大,那就不可能if(max(W,H)<max(w,h)) {cout<<"-1"; return 0;} cout<<min(func(W,w)+func(H,h),func(W,h)+func(H,w));return 0; } //29808 20197 //1900 28433思想
首先,想想有沒有不可能折成的情況
如果一個目標寬度比最大的還大,那就不可能折成。輸出"-1"。
接著,把四個輸入數按Ww,Hh或者是Wh,Hw這樣對應,
目的是模擬兩種折疊方式,即是把W折成w,H折成h還是把W折成h,H折成w。
最后兩種方式中取最小值即可。
cout<<min(func(W,w)+func(H,h),func(W,h)+func(H,w));再來看函數
一個邊界條件
if(b>=a) return 0;如果當前的目標寬度(b)大于或等于當前寬度(a)//好像應該是等于吧?不會大于了
就不用再折了。返回0;
應該問題就在這里吧?
我們只考慮要排除了“一個目標寬度比最大的還大”這種情況
要讓特判更全面
不妨讓判斷全在里面
再用返回值inf來判斷可不可以折成。
My Std
#include<bits/stdc++.h> using namespace std; int W,H,w,h; int func(double a,int b){if(b>a) return 0x3f3f3f;//這里把開始的一種情況拎出來了if(b==a) return 0;if(b>=a/2.0) return 1;return func(a/2.0,b)+1; } int main(){ // freopen("folding.in","r",stdin); // freopen("folding.out","w",stdout);cin>>W>>H>>w>>h;if(max(W,H)<max(w,h)) {cout<<"-1"; return 0;} cout<<min(func(W,w)+func(H,h),func(W,h)+func(H,w));return 0; } //這里是我開始錯了的一種情況 //29808 20197 //1900 28433 //答案:5 //錯誤答案:4?
OK!?
轉載于:https://www.cnblogs.com/send-off-a-friend/p/11189655.html
總結
以上是生活随笔為你收集整理的嵊州D5T2 折纸 folding的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱奇艺电脑版如何投放(爱奇艺电脑版如何投
- 下一篇: 广东省重点高中排名最新排名(广东21所重