关于一条线段最多能“碰”到多少个格子的问题

该程序分析了当一条长度为圆周率的线段在不同情况下与表格中格子碰撞的最多次数。通过比较经过最小边长和平方根长度时的碰撞数,确定最优策略,并处理特殊情况。最后,根据剩余长度计算额外碰撞次数,输出最大碰撞数。
摘要由CSDN通过智能技术生成

原题链接
一张表格里,给出每个格子长度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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值