原题链接
一张表格里,给出每个格子长度d与宽度w,求一条长度为圆周率的线段最多能“碰”到多少个格子。
分析:
若线段长度够长,易知最优方法是:1、要么经过min(d,w)长度且碰到2格;2、要么经过sqrt(d * d+w * w)长度且碰到3格。
例外的情况就是最优方法是2,而剩下的长度十分接近只剩2次第1种情况或者只剩1次第1种情况;最优方法是1,而剩下的长度十分接近只剩2次第2种情况或者只剩1次第2种情况,故最先求出这四种答案,最终比较即可。
double w,d;
int main(){
int T;
scanf("%d",&T);
while(T--){
double sum2=PI,sum1=PI,sum4=PI,sum3=PI,r,ch,chs;
LL ans1=4,ans2=4,ans3=4,ans4=4;
scanf("%lf%lf",&w,&d),r=sqrt(w*w+d*d);
if(w>d) swap(w,d);
if(w/2<r/3) ch=w,chs=2;
else ch=r,chs=3;
if(sum1>=r){
sum1-=r,ans1+=3;
sum3-=r,ans3+=3;
if(sum1>=r) sum1-=r,ans1+=3;
if(sum3>=w) sum3-=w,ans3+=2;
}
if(sum2>=w){
sum2-=w,ans2+=2;
sum4-=w,ans4+=2;
if(sum2>=r) sum2-=r,ans2+=3;
if(sum4>=w) sum4-=w,ans4+=2;
}
ans1+=floor(sum1/ch)*chs,ans2+=floor(sum2/ch)*chs,ans3+=floor(sum3/ch)*chs,ans4+=floor(sum4/ch)*chs;
printf("%lld\n",max(ans1,max(ans2,max(ans3,ans4))));
}
return 0;
}