我自己的代码,提交错误,需要修改
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <iostream>
#include <string>
#include <algorithm>
#define eps 1e-8
using namespace std;
struct point
{
double x;
double y;
int w;
point(){}
point (double tx, double ty)
{
x=tx; y=ty;
}
}a[300+10];
double Dist(point a, point b )
{
return sqrt( (b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y) );
}
point find_start(point p1, point p2)
{
/* point p, mid, start;
double d, aa;
p.x=p2.x-p1.x;
p.y=p2.y-p1.y;
mid.x = (p1.x +p2.x)/2;
mid.y = (p1.y +p2.y)/2;
d = sqrt( 1-Dist(p1, mid) );//公共弦长的一半长
if( fabs(p.y) < eps )
{
start.x = mid.x;
start.y = mid.y + d;
}
else
{
aa = atan(-p.x/p.y);
start.x = mid.x + d*cos(aa);
start.y = mid.y + d*sin(aa);
}
return start; */
point mid=point((p1.x+p2.x)/2,(p1.y+p2.y)/2);
double angle=atan2(p1.x-p2.x,p2.y-p1.y);
double d=sqrt(1-Dist(p1,mid)*Dist(p1,mid));
return point(mid.x+d*cos(angle), mid.y+d*sin(angle));
}
int main()
{
int n;
int i, j, k;
int ans, ans0;
point centre;
double tmp;
while(scanf("%d", &n)!=EOF)
{
if(n==0) break;
for(i=0; i<n; i++)
{
scanf("%lf %lf %d", &a[i].x, &a[i].y, &a[i].w );
}
ans=0; //结果至少为1
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
if( Dist(a[i], a[j]) > 2.0 )
continue;
ans0=0; //
centre = find_start(a[i], a[j]);
for(k=0; k<n; k++)
{
tmp = Dist(centre, a[k]);
if(tmp<1.00000001)
ans0+=a[k].w;
}
ans=max(ans, ans0);
}
}
printf("%d\n", ans );
}
return 0;
}
上述方法理论上的处理数据量不大
还有另外一种方法:可以参考如下博客
http://blog.csdn.net/acm_cxlove/article/details/7894310
hihocoder #1064 解题博客:地址:http://blog.csdn.net/u014076176/article/details/39825957
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define ll long long
#define db double
#define PB push_back
#define lson k<<1
#define rson k<<1|1
using namespace std;
const int N = 2005;
const db PI = acos(-1.0);
const db eps = 1e-8;
int sgn(db t)
{
return t<-eps?-1:t>eps;
}
struct Point
{
db x,y;
int w;
Point (db _x=0,db _y=0):x(_x),y(_y) {}
void input()
{
scanf("%lf%lf%d",&x,&y,&w);
}
db len2()
{
return x*x+y*y;
}
db len()
{
return sqrt(len2());
}
Point operator - (const Point &t) const
{
return Point(x-t.x,y-t.y);
}
bool operator == (const Point &t) const
{
return sgn(x-t.x)==0&&sgn(y-t.y)==0;
}
db operator * (const Point &t) const
{
return x*t.y-t.x*y;
}
} p[N];
struct node
{
db thta;
int w;
bool operator < (const node &t) const
{
if(thta==t.thta) return w>t.w;
return thta<t.thta;
}
} jd[N*4];
int ln;
void add(db thta,int w)
{
jd[ln].thta=thta,jd[ln++].w=w;
jd[ln].thta=thta+PI*2,jd[ln++].w=w;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++) p[i].input();
Point px;
int ans=0;
for(int i=0; i<n; i++)
{
px=Point(p[i].x+1.0,p[i].y);
ln=0;
int nw=p[i].w;
for(int j=0; j<n; j++)
{
if(i!=j)
{
db d=(p[i]-p[j]).len();
if(d>2.0) continue;
db thta=atan2((p[j]-p[i]).y,(p[j]-p[i]).x);
db th=acos(d/2.0);
add(thta-th,p[j].w),add(thta+th,-p[j].w);
}
}
sort(jd,jd+ln);
int mm=nw;
for(int j=0; j<ln; j++)
nw+=jd[j].w,mm=max(mm,nw);
ans=max(ans,mm);
}
printf("%d\n",ans);
return 0;
}
原文:http://www.cnblogs.com/yspworld/p/4356169.html