poj 1106(半圆围绕圆心旋转能够覆盖平面内最多的点)

Transmitters

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 4955   Accepted: 2624

Description

In a wireless network with multiple transmitters sending on the same frequencies, it is often a requirement that signals don‘t overlap, or at least that they don‘t conflict. One way of accomplishing this is to restrict a transmitter‘s coverage area. This problem uses a shielded transmitter that only broadcasts in a semicircle.

A transmitter T is located somewhere on a 1,000 square meter grid.
It broadcasts in a semicircular area of radius r. The transmitter may be
rotated any amount, but not moved. Given N points anywhere on the grid,
compute the maximum number of points that can be simultaneously reached
by the transmitter‘s signal. Figure 1 shows the same data points with
two different transmitter rotations.

All input coordinates are integers (0-1000). The radius is a
positive real number greater than 0. Points on the boundary of a
semicircle are considered within that semicircle. There are 1-150 unique
points to examine per transmitter. No points are at the same location
as the transmitter.

Input

Input
consists of information for one or more independent transmitter
problems. Each problem begins with one line containing the (x,y)
coordinates of the transmitter followed by the broadcast radius, r. The
next line contains the number of points N on the grid, followed by N
sets of (x,y) coordinates, one set per line. The end of the input is
signalled by a line with a negative radius; the (x,y) values will be
present but indeterminate. Figures 1 and 2 represent the data in the
first two example data sets below, though they are on different scales.
Figures 1a and 2 show transmitter rotations that result in maximal
coverage.

Output

For
each transmitter, the output contains a single line with the maximum
number of points that can be contained in some semicircle.

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

题意:半圆围绕圆心旋转能够覆盖平面内最多的点题解:先去掉所有和圆心距离大于r的点,然后我们以每一点和圆心组成的线段为边界来计算线段两边的点,比较出最大值就好了.记得赋值最大值的时候要赋值为0,因为它有可能不会进循环。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include <stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int N = 160;
const double eps = 1e-8;
struct Point{
    double x,y;
}p[N],circle;
struct Line{
    Point a,b;
}line;
double r;
int n;
int cross(Point a,Point b,Point c){
    double ans = (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
    if(fabs(ans)<eps) return 0;
    if(ans<0) return 1;
    return -1;
}
int main(){
    while(true){
        scanf("%lf%lf%lf",&circle.x,&circle.y,&r);
        if(r<=0) break;
        scanf("%d",&n);
        int k = 0;
        for(int i=0;i<n;i++){
            double x,y;
            scanf("%lf%lf",&x,&y);
            if((x-circle.x)*(x-circle.x)+(y-circle.y)*(y-circle.y)>r*r) continue;
            p[k].x = x;
            p[k++].y = y;
         }
         int temp1 ,temp2,mx = 0; ///mx要赋值为0,因为有可能一个点都没有,习惯赋值成-1被坑了一把
         for(int i=0;i<k;i++){
            line.a = p[i];
            line.b = circle;
            temp1=temp2 =0;
            for(int j=0;j<k;j++){
                if(cross(p[j],line.a,line.b)==0) {
                    temp1++;
                    temp2++;
                }else if(cross(p[j],line.a,line.b)==1){
                    temp1++;
                }else temp2++;
            }
            int ans = max(temp1,temp2);
            mx = max(ans,mx);
         }
         printf("%d\n",mx);
    }
    return 0;
}
时间: 2024-10-12 03:50:25

poj 1106(半圆围绕圆心旋转能够覆盖平面内最多的点)的相关文章

poj 1106 Transmitters (计算几何,叉积||极角排序)

Transmitters Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4817   Accepted: 2576 Description In a wireless network with multiple transmitters sending on the same frequencies, it is often a requirement that signals don't overlap, or at

POJ 1106 Transmitters(计算几何:叉积)

传送门 Transmitters Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5088 Accepted: 2686 Description In a wireless network with multiple transmitters sending on the same frequencies, it is often a requirement that signals don't overlap, or at

IOS 以任意点为圆心 旋转UIView

围绕底边中点旋转                     UIView本身是支持旋转的,可以用UIView.transform属性实现旋转. The origin of the transform is the value of the center property, or the layer's anchorPoint property if it was changed. 这个旋转默认是围绕这UIView.center或者UIView.layer.anchorPoint旋转的.似乎UIVi

定时器实现的地球围绕太阳旋转

一个地球围绕太阳旋转 1 #import "HUAppDelegate.h" 2 3 #define CENTER_X 160 4 #define CENTER_Y 240 5 #define RADIUS 130 6 7 @implementation HUAppDelegate 8 9 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)laun

html5 canvas围绕中心点旋转

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

POJ 1106

先判断是否在圆内,然后用叉积判断是否在180度内.枚举判断就可以了... 感觉是数据弱了.. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double eps=0.00000001; struct point{ double x,y; }p[1050

IOS 以随意点为圆心 旋转UIView

环绕底边中点旋转                     UIView本身是支持旋转的,能够用UIView.transform属性实现旋转. The origin of the transform is the value of the center property, or the layer's anchorPoint property if it was changed. 这个旋转默认是环绕这UIView.center或者UIView.layer.anchorPoint旋转的. 似乎UIV

poj 1106 Transmitters (叉乘的应用)

http://poj.org/problem?id=1106 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4488   Accepted: 2379 Description In a wireless network with multiple transmitters sending on the same frequencies, it is often a requirement that signals don

围绕鼠标旋转的炫酷三叶空间旋浆效果

<html><head><title>围绕鼠标旋转的三叶空间旋浆</title><meta content="text/html; charset=gb2312" http-equiv="Content-Type"></head><body bgColor="#000000"><scriptlanguage="JavaScript">