题意:

      在一个二维平面上有n个流星,每个流星有自己的初始位置和速度,有一个照相机,张相机的可视范围是一个矩形框,左下角(0,0)右上角(w ,h),然后问你相机的矩形内出现的最多的流星数是多少? 

思路:

      感觉是一道很不错的题目,想到流星数目,第一反应就是可以把他转化成时间段,我们求出每个流星的进入相机时间,和出相机时间,这样就会得到一个时间段,流星的最大

数量也就是时间段的最大重叠部分,这个不解释了应该不难理解,现在问题就来了,我们怎么求得所有的时间段呢?一开始我也感觉很麻烦,然后在白书上学了一个比较方便的方法,我们求时间段可以先把流星分解了,x,y单独算,进入的时间肯定是进x进y的最大值,出去的时间肯定是出x,出y的最小值,这样我们分别求完之后就ok了,如果L>=R就证明没有在相机范围内出现过,下面给出求L,R的代码

void Update(int x ,int a ,int w ,double& L ,double& R)

{

   if(a == 0)

   {

       if(x <= 0 || x >= w) R = L - 1; //永远也进步了相机

   }

   else if(a > 0)//往上跑 

   {

      L = Max(L ,-(double)x / a);

      R = Min(R ,(double)(w - x) / a);

   }

   else//往下跑

   {

      L = Max(L ,(double)(w - x) / a);//理解不了的注意这里的a是负的

      R = Min(R ,-(double)x / a); 

   }

           

}

求x,y的时候都是用的上面的那个,只不过传的参数不一样罢了,具体细节可以看代码。

  这样我们就得到了所有流星的时间段L,R(L>=R的是不满足的,直接丢弃),然后就是求区间的最大重叠面积了,这个也比较好求,如果你不嫌麻烦可以写线段树贪心去求,时间复杂度是O(n*log(n))的,不过有一个更省事更快的方法,就是扫面线法O(n)<其实这么说有漏洞,因为扫描线涉及到排序,排序是O(n*log(n))的,这个地方大家知道就行了>,我们可以把所有端点都扔进结构体数组里,然后按照时间从小到大排序,如果时间相等那么就后端点在前面(这样的原因是题目中说在相机边框上的不算,如果算的话就入端点在前面),排序之后直接扫一遍,遇到前端点就++,后端点就--,过程中最大的值就是答案,这个应该很好理解,不理解的在纸上画一画,每次变化的时候都是在端点上变化的,这个就是经典的扫描线想法,扫描线也可以配合着线段树应用,求重叠面积,体积,周长啥的。这个题目还有一个小小的优化(白书上说的),我们可以躲开浮点运算,因为整个程序里涉及到的除法就是除以速度,速度的范围是绝对值<=10,那么我们直接把被除数扩大1,2,3..10的最小公倍数2520倍就行了,这样保证都是整除,至于为什么我想不用我解释了。

#include<stdio.h>

#include<string.h>

#include<algorithm>

#define N 100000 + 10

using namespace std;

typedef struct

{

    int mk;

    double time;

}NODE;

NODE node[N+N];

bool camp(NODE a ,NODE b)

{

     return a.time < b.time || a.time == b.time && a.mk < b.mk;

}

double Max(double x ,double y)

{

    return x > y ? x : y;

}

double Min(double x ,double y)

{

    return x < y ? x : y;

}

void Update(int x ,int a ,int w ,double& L ,double& R)

{

   if(a == 0)

   {

       if(x <= 0 || x >= w) R = L - 1;

   }

   else if(a > 0) 

   {

      L = Max(L ,-(double)x / a);

      R = Min(R ,(double)(w - x) / a);

   }

   else

   {

      L = Max(L ,(double)(w - x) / a);

      R = Min(R ,-(double)x / a); 

   }

           

}

int main ()

{

    int t ,w ,h ,n ,i;

    int x ,y ,a ,b;

    scanf("%d" ,&t);

    while(t--)

    {

       scanf("%d %d" ,&w ,&h);

       scanf("%d" ,&n);

       int nowid = 0;

       for(i = 1 ;i <= n ;i ++)

       {

          scanf("%d %d %d %d" ,&x ,&y ,&a ,&b);

          double L = 0 ,R = 999999999;

          Update(x ,a ,w ,L ,R);

          Update(y ,b ,h ,L ,R);

          if(L < R)

          {

             node[++nowid].time = L;

             node[nowid].mk = 1;

             node[++nowid].time = R;

             node[nowid].mk = -1;

          }

       }

       int Ans = 0;

       sort(node + 1 ,node + nowid + 1 ,camp);

       int sum = 0;

       for(i = 1 ;i <= nowid ;i ++)

       {

          sum += node[i].mk;

          if(Ans < sum) Ans = sum;

       }

       printf("%d\n" ,Ans);

    }

    return 0;  

}

   

//排除浮点型运算

void Update(int x ,int a ,int w ,int& L ,int& R)

{

   if(a == 0)

   {

       if(x <= 0 || x >= w) R = L - 1;

   }

   else if(a > 0) 

   {

      L = Max(L ,-x * 2520 / a);

      R = Min(R ,(w - x) * 2520 / a);

   }

   else

   {

      L = Max(L ,(w - x) * 2520/ a);

      R = Min(R ,-x * 2520/ a); 

   }

           

}

LA3905流星的更多相关文章

  1. canvas流星月亮星星银河

    这是页面的特效,首先月亮直接出现,然后星星和银河渐渐的出现(一闪一闪),最后流星划过,留下完美的句点. 所有的动画都是通过帧来实现的. 星星的代码分为2部分,首先是随机生成星星,然后是绘制星星,最后是 ...

  2. iOS - CAEmitterLayer流星

    效果图: 流星: #pragma mark - loading animation - (void)showLoadingAnimation { CGRect mainBounds = [[UIScr ...

  3. 【原创】java 流星划过天空

    import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.s ...

  4. TurnipBit口袋编程计算机:和孩子一起DIY许愿的流星

    听说对着流星许愿,许的愿望都会实现,虽然不知道这个说法是不是真的,但是流星还是很好看的,为了能一直看到流星,今天就自己做一个流星保存下来,想什么时候看,就什么时候看. 首先需要想象一下流星是什么样子的 ...

  5. 5.HTML+CSS制作一颗流星

    效果地址:https://codepen.io/flyingliao/pen/pBzKbZ HTML code: <div class="sky"> <span& ...

  6. LA3905

    题意: 给出n颗流星,第i颗在第T秒时飞到(xi+ai*t,yi+bi*t),给出一个矩形,问在某一时刻这个矩形中的流星数目最多有多少 题解: 首先计算出每一颗流星经过时间 然后左端点移动,计算出少了 ...

  7. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自己定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果

     1 粒子 演示样例 2 类图关系 3 系统原生粒子 CCParticleSystem 全部粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad ...

  8. LA-3905 (扫描线)

    题意: 给一些流星的初始位置和运动向量,给了相机的拍摄范围;问你最多能拍到多少颗流星; 思路: 将流星用出现在相机拍摄范围内的时间段表示;sort后在扫面端点更新最大值; Ac代码: #include ...

  9. Win10《芒果TV》更新v3.8.30流星版:优化稳定性、升级无边框播放体验

    随着暑假到来,大波王牌综艺和青春电视剧热浪来袭,Win10版<芒果TV>全平台同步更新流星版v3.8.30,进一步提升稳定性,巩固播放体验,升级剧场模式和画中画无边框体验,我们在芒果等你. ...

随机推荐

  1. Salesforce LWC学习(三十一) Quick Action适配

    本篇参考:https://www.lightningdesignsystem.com/components/modals/ 随着salesforce lwc的优化,越来越多的项目从aura转到了lwc ...

  2. CVE-2017-10271 XMLDecoder 反序列化

    漏洞描述:WebLogic的 WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,可以构造请求对运行 ...

  3. Shiro 反序列化漏洞利用

    环境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 # 80 ...

  4. 关于win10 编辑文件时权限不足问题

    win10默认是不开启administrator账户的,所以一般是自己创建一个账户,但是此账户,可能会有些文件或文件夹,访问不了,编辑不了,这时候,只需要右键->属性->安全->编辑 ...

  5. Docker 三剑客 到 k8s 介绍

    一.Docker 三剑客 Docker-Compose Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启 ...

  6. 003-try-catch-finally-return执行顺序问题

    一.try-catch-finally-return执行顺序问题 0.原始执行顺序 try - > finally try -> catch -> finally 1.try cat ...

  7. Redis的常用淘汰策略以及算法实现

    一.Redis的内存配置 1,Redis配置内存为多少合适? 默认:如果不设置最大内存大小或者设置最大内存大小为0,在64为操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存. 极限情况: ...

  8. C# 获取网页信息

    获取网页源码 ///通过HttpWebResponse public string GetUrlHtml(string url) { string strHtml = string.Empty; Ht ...

  9. Java例题_38 自定义函数求字符串长度

    1 /*38 [程序 38 求字符串长度] 2 题目:写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度. 3 */ 4 5 /*分析 6 * 1.从键盘得到一个字符串 7 ...

  10. BST(二叉搜索树)的基本操作

    BST(二叉搜索树) 首先,我们定义树的数据结构如下: public class TreeNode { int val; TreeNode left; TreeNode right; public T ...