海外产品网站建设,什么叫模板网站,株洲市网站建设,万建站南昌折纸 folding 【问题描述】 在非常紧张的 NOIP 考试中#xff0c;有人喜欢啃指甲#xff0c;有人喜欢转铅笔#xff0c;有人喜欢撕 纸条#xff0c;……而小 x 喜欢迷折纸。 现有一个 W * H 的矩形纸张#xff0c;监考老师想知道#xff0c;小 x 至少要折多少次才能使 矩…折纸 folding 【问题描述】 在非常紧张的 NOIP 考试中有人喜欢啃指甲有人喜欢转铅笔有人喜欢撕 纸条……而小 x 喜欢迷折纸。 现有一个 W * H 的矩形纸张监考老师想知道小 x 至少要折多少次才能使 矩形纸张变成 w * h 的矩形纸张。 注意每次的折痕都要平行于纸张的某一条边。 【输入格式】 第一行包括两个整数 WH。 第二行包括两个整数 wh。 【输出格式】 输出一个整数表示至少需要折的次数。若无解则输出-1。 【输入输出样例】 Input1Input2 Input3 2 7 2 2 5 5 1 6 10 6 4 8 Output1Output2Output32-1 2【数据说明】 对于 20% 的数据满足W w 且 Hh≤3。 对于 100% 的数据满足 1 ≤ WHwh ≤ 9 10 。 Solve 先从错误中得出正确结论 #includebits/stdc.h
using namespace std;
int W,H,w,h;
int func(double a,int b){if(ba) return 0;if(ba/2.0) return 1;return func(a/2.0,b)1;
}
int main(){
// freopen(folding.in,r,stdin);
// freopen(folding.out,w,stdout);cinWHwh;//特判 //如果一个目标宽度比最大的还大那就不可能if(max(W,H)max(w,h)) {cout-1; return 0;} coutmin(func(W,w)func(H,h),func(W,h)func(H,w));return 0;
}
//29808 20197
//1900 28433 思想 首先想想有没有不可能折成的情况 如果一个目标宽度比最大的还大那就不可能折成。输出-1。 接着把四个输入数按Ww,Hh或者是Wh,Hw这样对应 目的是模拟两种折叠方式即是把W折成wH折成h还是把W折成hH折成w。 最后两种方式中取最小值即可。 coutmin(func(W,w)func(H,h),func(W,h)func(H,w)); 再来看函数 一个边界条件 if(ba) return 0; 如果当前的目标宽度b大于或等于当前宽度a//好像应该是等于吧不会大于了 就不用再折了。返回0 应该问题就在这里吧 我们只考虑要排除了“一个目标宽度比最大的还大”这种情况 要让特判更全面 不妨让判断全在里面 再用返回值inf来判断可不可以折成。 My Std #includebits/stdc.h
using namespace std;
int W,H,w,h;
int func(double a,int b){if(ba) return 0x3f3f3f;//这里把开始的一种情况拎出来了if(ba) return 0;if(ba/2.0) return 1;return func(a/2.0,b)1;
}
int main(){
// freopen(folding.in,r,stdin);
// freopen(folding.out,w,stdout);cinWHwh;if(max(W,H)max(w,h)) {cout-1; return 0;} coutmin(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