zoj 2010 || poj 1380 Equipment Box

这个题哈。。之前和会升讨论过,推算公式无果,他用神马离散化过掉了。。。我今天重新看这题,也用了那个方法。。

 

传说中的离散化,这题感觉就是,一个一个试。。。

 

把里面的矩形每次旋转一定角度,然后根据角度求出包含它的最小矩形的长宽,然后和给的对比。

 

开始用弧度,死活过不去,后来看会升的,他居然判等了= =。。明明题目上说不能碰边界的。。。我改成等后zoj还是不对,改成角度,才过了,增量0.1,0.2就WA了,1S过的 = =。。。题意坑姐啊。。

 

后来用弧度制,一个一个试,增量0.003才过,0.004就WA。。。

 

刚搜了下题解,貌似有人推公式了!!!无比仰慕!!!http://www.cppblog.com/Uriel/articles/127186.html

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; const double pi = acos(-1.0); double d1,d2,r1,r2; bool solve() { double d = 0.0; double t1,t2; while( d*2 < pi ) { t1 = r1*sin(d) + r2*cos(d); t2 = r1*cos(d) + r2*sin(d); if( ceil(t1) <= d1 && ceil(t2) <= d2 || ceil(t1) <= d2 && ceil(t2) <= d1 ) return true; d += 0.003; } return false; } int main() { int ncases; scanf("%d",&ncases); while( ncases-- ) { scanf("%lf%lf%lf%lf",&d1,&d2,&r1,&r2); if( solve() ) printf("Escape is possible./n"); else printf("Box cannot be dropped./n"); } return 0; }  

你可能感兴趣的:(2010)