ZOJ 1041 Transmitters

本文介绍了一种通过线性规划来解决雷达半圆形覆盖范围内最多能覆盖多少个目标点的问题。利用每个点与雷达中心点构成的直线方程,通过比较各点在该直线上的相对位置来确定最大覆盖数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的)

Input

Output

Sample Input

25 25 3.5------雷达坐标与半径
7----------点数
25 28-------点坐标
23 27
27 27
24 23
26 23
24 29
26 29
350 200 2.0
5
350 202
350 199
350 198
348 200
352 200
995 995 10.0
4
1000 1000
999 998
990 992
1000 999
100 100 -2.5
Sample Output

3
4
4
做法:每个点与中点都组成一个直线方程完后线性规划看其他的点在这条直线左边的inc(s)在右边的inc(b)在直线的inc(m),完后比较m+s与max的大小和b+m与max的大小
代码如下:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int ry,rx,n,x[10000],y[10000];
double  r;
int main()
{
    int q,p,t,m,b,s,max;
    while (~scanf("%d%d%lf",&rx,&ry,&r)&&r>0)
    {
        cin>>n;
        t=0;
        max=0;
        for (int i=1;i<=n;i++)
        {
            cin>>q>>p;
            if (sqrt((q-rx)*(q-rx)+(p-ry)*(p-ry))<=r)
            {
                t++;
                x[t]=q; y[t]=p;
            }
        }   
        for (int i=1;i<=t;i++)
        {
            m=0;b=0;s=0;
            for (int j=1;j<=t;j++)
            {
                if ((y[j]-ry)*(x[i]-rx)-(x[j]-rx)*(y[i]-ry)==0) m++;
                if ((y[j]-ry)*(x[i]-rx)-(x[j]-rx)*(y[i]-ry)<0)  s++;
                if ((y[j]-ry)*(x[i]-rx)-(x[j]-rx)*(y[i]-ry)>0)  b++;
            }
            if (b+m>max)    max=b+m;
            if (s+m>max)    max=s+m;
        }
        cout<<max<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值