码迷,mamicode.com
首页 > 其他好文 > 详细

D - Meteor

时间:2015-10-27 22:04:39      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

LA 3905

 

题意:有一个照相机相框,只有在相框内的点才可以被拍到,每一个点都有起始位置(x,y)和速度(a,b),问这个相框最多可以拍摄到多少个点

思路:拍摄肯定是一个瞬时性的动作,那么最终拍摄到点的多少肯定与时间的选取有关,因此可以吧所有的点在相框内出现的时间转化为一个区间。

最后进行遍历,遇到左区间加一,遇到右区间减一

 

技术分享
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=1e5+10;
struct node
{
    double x;
    int type;
    bool operator < (const node & a) const
    {
        if(x!=a.x)
            return x<a.x;
        return  type>a.type;           //如果位置相同,肯定右区间在前,因为在相机边界上的点不会被照到
    }
}event[maxn*2];

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;
    scanf("%d",&T);
    while(T--)
    {
     int n,w,h,x,y,a,b,e=0;
     scanf("%d%d%d",&w,&h,&n);
     for(int i=0;i<n;i++)
     {
         scanf("%d%d%d%d",&x,&y,&a,&b);
         double l=0,r=1e9;
         update(x,a,w,l,r);
         update(y,b,h,l,r);
         if(l<r)
         {
             event[e++]=(node) {l,0};
             event[e++]=(node) {r,1};
         }
     }
         sort(event,event+e);
         int ans=0;
         int cnt=0;
         for(int i=0;i<e;i++)
         {
             if(event[i].type==0) ans=max(ans,++cnt);
             else                 cnt--;
         }
         printf("%d\n",ans);
     }
    return 0;
}
View Code

 

D - Meteor

标签:

原文地址:http://www.cnblogs.com/zsyacm666666/p/4915537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!