B题.[Codeforces 53B] Little Frog
思路: 枚举题目中要求的2x
第一次枚举高=2x(0<=x<=30) ,若w>=floor(2x/0.8), 则H取2x, W取floor(2x/0.8);若floor(2x/0.8)>w>=ceil(2x/1.25), 则H取2x, W取w;否则无法按要求比例裁剪。
第二次枚举宽=2x(0<=x<=30) ,若h>=floor(2x * 1.25), 则H取floor(2x * 1.25), W取2x;若floor(2x * 1.25)>h>=ceil(2x * 0.8), 则H取h,W取2x;否则无法按要求比例裁剪。
然后取使面积H*W中最大的一个H和W(若面积相同,则取H大的)
其中ceil是向上取整,floor是向下取整,具体用什么取决于0.8<=H/W<=1.25
//AC代码,由于floor和ceil函数的某些问题,需要提交MicroSoft C++2017才能通过
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int h,w,ansh,answ;
ll anss;
int main(){
cin>>h>>w;
//枚举高
for(int i=0;i<=30;i++){
int now=(1<<i);
if(now>h)break;
if(w>=(int)floor(now/0.8)){
if((ll)now*(int)floor(now/0.8)>anss||((ll)now*(int)floor(now/0.8)==anss&&now>ansh)){
anss=(ll)now*(int)floor(now/0.8);
ansh=now;
answ=(int)floor(now/0.8);
}
}else
if(w>=(int)ceil(now/1.25)){
if((ll)now*w>anss||((ll)now*w==anss&&now>ansh)){
anss=(ll)now*w;
ansh=now;
answ=w;
}
}
}
//枚举宽
for(int i=0;i<=30;i++){
int now=(1<<i);
if(now>w)break;
if(h>=(int)floor(now*1.25)){
if((ll)now*(int)floor(now*1.25)>anss||((ll)now*(int)floor(now*1.25)==anss&&(int)floor(now*1.25)>ansh)){
anss=(ll)now*(int)floor(now*1.25);
ansh=(int)floor(now*1.25);
answ=now;
}
}else
if(h>=(int)ceil(now*0.8)){
if((ll)now*h>anss||((ll)now*h==anss&&h>ansh)){
anss=(ll)now*h;
ansh=h;
answ=now;
}
}
}
cout<<ansh<<" "<<answ;
}