HDU-2469 File-Control System 计算几何

题目链接:https://vjudge.net/problem/HDU-2469

题目大意:给你n个点,要求你找出面积最小的扇形,使得这个扇形覆盖这n个点中的k个点,输出这个扇形的面积。

思路:枚举每一个点,找出半径等于这个点到原点距离的最小扇形,覆盖k个点,为了避免一些比较刁钻的角度(纯粹是为了代码好写),将所有点复制一下并且角度加2\pi,在计算扇形是否包括k个点时可使用双端队列,当头尾点相同时结束循环。时间复杂度O(n^{2})

下面是AC代码:

#include
using namespace std;
const int MAXN=5e3+5;
const double pi=acos(-1);
class point
{
public:
    int x,y;
    int len;
    double jiao;
    point(){}
    point(int x,int y):x(x),y(y),len(x*x+y*y)
    {
        jiao=atan2(y,x);
    }
    bool operator < (const point other)const
    {
        return jiaoq;
            double jiao=10*pi;
            for(int j=0;j1&&q.front()==q.back())break;
                if(input[j].len<=len)q.push_back(input[j]);
                if(q.size()>k)q.pop_front();
            }
            if(q.size()==k)
            {
                jiao=min(jiao,q.back().jiao-q.front().jiao);
            }
            ans=min(ans,jiao*len/2);
        }
        printf("%.2f\n",ans);
    }
    return 0;
}

 

反思:感觉最近做题的时候思路都被局限了,总想着时间复杂度O(n^{2}) 的代码肯定过不了,然后这题朝着O(nlogn)的方向想了好久都没思路,以后要注意。

你可能感兴趣的:(算法学习)