您当前的位置: 首页 > 

HeartFireY

暂无认证

  • 1浏览

    0关注

    334博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

牛客多校8.K.Yet Another Problem About Pi 计算几何/思维

HeartFireY 发布时间:2021-08-09 19:36:32 ,浏览量:1

Problem Analysis

题目大意转述:给你一个无限延伸的网格的长和宽,现在有一条固定长度的绳子(长为 π \pi π​),绳子可以摆成任意形状,求放到网格上去最多能经过的网格数目。

首先要确定绳子怎么摆才能达到这个目的:我们要经过近可能多的点,那么要经过尽可能多的顶点,而经过定点分为两种情况:

在这里插入图片描述

在左侧的情况中,经过上面的点时,利用绳子无限小数部分向四个格子延展出一点点,可以使绳子穿过四个格子;而竖着向下走,再统计下一个点的情况时,我们可以发现途中蓝色阴影部分的两个格子是被重复统计的

在右侧的情况中,同样经过两个点,我们发现被重复统计的点只有一个。但是相比于第一种走法,它需要耗费更长的长度。

那么为了保证同一长度能够覆盖尽可能多的格子,我们有两种可供选择的方案:我们先举一个例子

在这里插入图片描述

很显然,在这个例子中全直着走,全斜着走能覆盖的方格数目均不是最多的,直着走会因为重复统计而使产生过多无意义贡献;斜着走会因为长度限制而无法到达第三个点,从而导致放个覆盖数目减少。因此我们需要两者进行组合,那么就用两种方案

  1. 尽可能直着走,如果直着走到最后无法到达下一个点,考虑去除最后一个经过点改成斜着走
  2. 尽可能斜着走,①走到最后判断剩余的长度是否够一条直边,②去掉最后经过点改成直着走能否经过两个点

剩下的就是注意控制精度误差等等了。

AC Code

#include 
using namespace std;

const double pi = acos(-1);

inline int solve(){
    double x, y; cin >> x >> y;
    double cro = sqrt(x * x + y * y);
    if (x > y) x = y;
    if (x > pi) return cout             
关注
打赏
1662600635
查看更多评论
0.0380s