[Daily] 20200710

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取2xfloor(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;
}	

猜你喜欢

转载自blog.csdn.net/qq_45530271/article/details/107267715