【Electric Fences】电力篱笆

【Problem description】

农夫约翰已经决定建造电网。他已经把他的农田围成一些奇怪的形状,现在必须找出安放电源的最佳位置。
  对于段电网都必须从电源拉出一条电线。电线可以穿过其他电网或者跨过其他电线。电线能够以任意角度铺设,从电源连接到一段电网的任意一点上(也就是,这段电网的端点上或者在其之间的任意一点上)。这里所说的“一段电网”指的是呈一条线段状的电网,并不是连在一起的几段电网。若几段电网连在一起,那么也要分别给这些电网提供电力。
  已知所有的 F(1 <= F <= 150)段电网的位置(电网总是和坐标轴平行,并且端点的坐标总是整数,0 <= X,Y <= 100)。你的程序要计算连接电源和每段电网所需的电线的最小总长度,还有电源的最佳坐标。

电源的最佳坐标可能在农夫约翰的农田中的任何一个位置,并不一是整数。

【Input format】

第一行包括 F ——电网的数量。
下面的 F 行每行包括两个 X,Y 对,表示这段电网的两个端点。

【Output format】

只有一行,输出三个浮点数,相邻两个之间留一个空格。假定你的电脑的输出库会正确地对小数进行四舍五入。
  这三个数是: 电源最佳坐标的 X 值,
  电源最佳坐标的 Y 值,和
  需要的电线的总长度(要最小)。

【Algorithm design】

Greed Enumeration

【Problem analysis】

离散程度为0.1 如果强行枚举

对于地图上1000*1000个点穷举

算出其到150条篱笆的距离

到单条篱笆的距离用数学思想 是O(1)的算法

复杂度为O(10^6*150)

后来想是不是可以使用三分法取一条线上的最值

但是不满足单调函数性质

所以此法作废

发现对于一个区域内的点相差必然不会太大

推论出答案点必然位于较优的整数点附近

可以把所有整数点花费计算出来

Sort之后

取一定数量的点进行寻找答案

因为对于单个点算距离是O(150)

一个整数点可以引申出400个点

所以取了1000个点可以恰好不超时

O(1000*400*150)

将着1000个点引申出的所有小数点进行排序即可

还有一点要注意 在列举点的时候有的点位于同一个矩形内

所以可以加个vit 避免冗余的计算

【Source code】

#include <bits/stdc++.h>

#define F(i,j,k) for(int i=j;i<=k;i++)

#define D(i,j,k) for(int i=j;i>=k;i--)

#define max_cnt 151

#define bound_map 101

using namespace std;

double dx[4]={1,-1,1,-1};

double dy[4]={1,-1,-1,1};

int cnt_fence,cnt_int,vit[bound_map][bound_map];

double x_least,y_least,cost_least,x_ans,y_ans,bound_fence[max_cnt][2][2],dis_int[bound_map][bound_map],point_map[2];

//bound_fence「顺序」「始/末」「横/纵」

struct stud

{

double cost;

double x;

double y;

}cost_int[bound_map*bound_map];

bool cmp(stud p,stud q)

{

if(p.cost!=q.cost)return p.cost<q.cost;

if(p.x!=q.x)return p.x<q.x;

return p.y<q.y;

}

double mi(double x)

{

return x*x;

}

double distance(double sub[])

{

double dis=0;

F(turn,1,cnt_fence)

F(direct,0,1)

if(bound_fence[turn][0][direct]==bound_fence[turn][1][direct])

{

if(sub[1-direct]>=bound_fence[turn][0][1-direct]&&sub[1-direct]<=bound_fence[turn][1][1-direct])

dis+=abs(bound_fence[turn][0][direct]-sub[direct]);

else

dis+=sqrt(mi(bound_fence[turn][0][direct]-sub[direct])+min(mi(sub[1-direct]-bound_fence[turn][0][1-direct]),mi(sub[1-direct]-bound_fence[turn][1][1-direct])));

break;

}

return dis;

}

void search(int direct)

{

for(double sub1=0;sub1<=1;sub1+=0.1)

for(double sub2=0;sub2<=1;sub2+=0.1)

{

point_map[0]=x_least+dx[direct]*sub1;

point_map[1]=y_least+dy[direct]*sub2;

double dis_now=distance(point_map);

if(dis_now<cost_least)

{

cost_least=dis_now;

x_ans=point_map[0];

y_ans=point_map[1];

}

}

return;

}

void input()

{

cin>>cnt_fence;

F(i,1,cnt_fence)

{

F(j,0,1)F(k,0,1)cin>>bound_fence[i][j][k];

F(k,0,1)

if(bound_fence[i][0][k]>bound_fence[i][1][k])

swap(bound_fence[i][0][k],bound_fence[i][1][k]);

}

return;

}

void work_int()

{

for(point_map[0]=0;point_map[0]<bound_map;point_map[0]++)

for(point_map[1]=0;point_map[1]<bound_map;point_map[1]++)

dis_int[(int)point_map[0]][(int)point_map[1]]=distance(point_map);

F(i,0,bound_map-1)

F(j,0,bound_map-1)

{

cnt_int++;

cost_int[cnt_int].cost=dis_int[i][j];

cost_int[cnt_int].x=(double)i;

cost_int[cnt_int].y=(double)j;

}

sort(cost_int+1,cost_int+cnt_int+1,cmp);

return;

}

void work_dou()

{

cost_least=cost_int[1].cost;

x_ans=cost_int[1].x;

y_ans=cost_int[1].y;

F(turn,1,min(1000,cnt_int))

{

x_least=cost_int[turn].x;

y_least=cost_int[turn].y;

vit[(int)x_least][(int)y_least]=1;

F(i,0,3)

{

if(x_least+dx[i]<bound_map&&x_least+dx[i]>=0&&y_least+dy[i]<bound_map&&y_least+dy[i]>=0&&!vit[(int)(x_least+dx[i])][(int)(y_least+dy[i])])

search(i);

}

}

return;

}

void output()

{

printf("%.1lf %.1lf %.1lf\n",x_ans,y_ans,cost_least);

return;

}

int main()

{

freopen("fence.in","r",stdin);

freopen("fence.out","w",stdout);

input();

work_int();

work_dou();

output();

return 0;

}

原文地址:https://www.cnblogs.com/qswx/p/9155679.html

时间: 2024-10-13 18:00:02

【Electric Fences】电力篱笆的相关文章

USACO 6.4 Electric Fences

Electric FencesKolstad & Schrijvers Farmer John has decided to construct electric fences. He has fenced his fields into a number of bizarre shapes and now must find the optimal place to locate the electrical supply to each of the fences. A single wir

洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理

题目描述 在本题中,格点是指横纵坐标皆为整数的点. 为了圈养他的牛,农夫约翰(Farmer John)建造了一个三角形的电网.他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0<=n<32000,0<m<32000),再连接格点(p,0)(p>0),最后回到原点. 牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分瘦的牛).如果一个格点碰到了电网,牛绝对不可以被放到该格点之上(或许Farmer John会有一些收获).那么有多少头牛可以被放到农夫约翰的电网

P2735 电网 Electric Fences

题目描述 在本题中,格点是指横纵坐标皆为整数的点. 为了圈养他的牛,农夫约翰(Farmer John)建造了一个三角形的电网.他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0<=n<32000,0<m<32000),再连接格点(p,0)(p>0),最后回到原点. 牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分瘦的牛).如果一个格点碰到了电网,牛绝对不可以被放到该格点之上(或许Farmer John会有一些收获).那么有多少头牛可以被放到农夫约翰的电网

USACO6.4-Electric Fences:计算几何

Electric Fences Kolstad & Schrijvers Farmer John has decided to construct electric fences. He has fenced his fields into a number of bizarre shapes and now must find the optimal place to locate the electrical supply to each of the fences. A single wi

中英文美国电厂热平衡类计算Thermoflow.Pro.v19.0+无限制电力软件GateCycle 6.1.1带录像.zip

中英文美国电厂热平衡类计算Thermoflow.Pro.v19.0+无限制电力软件GateCycle 6.1.1带录像.zip架空电力线设计软件PLS-CADD v12.3-ISO 1CDThermoflow电力及热电联产工业中热能工程软件的领先开发者.自1987年以来,Thermoflow 软件系列产品已成长为迄今为止能找到的最受欢迎.经过严密检验.综合的软件系统Thermoflow 2008 是一个稳定.盈利.完全独立的公司.Thermoflow 除了面向客户的销售,从来没有接受过任何外来资

电力保护装置协调软件CYME.CYMTCC.v4.5.R8

Keil.mdk3.23a(Realview.Microcontroller.Development.Kit.V3.23a) RealView.Microcontroller.Development.Kit.V3.22A (MDK) OPNET.Modeler.14.0.A.PL3 PCBM LP Provisional V7.02完美版 PROCLARITY.ANALYTIC.PLATFORM.V4.0 Analytic.PlatFORM.Server.v6.0 P-CAD 2001  P-C

USACO 6.5 Closed Fences

Closed Fences A closed fence in the plane is a set of non-crossing, connected line segments with N corners (3 < N < 200). The corners or vertices are each distinct and are listed in counter-clockwise order in an array {xi, yi}, i in (1..N). Every pa

USACO6.5-Closed Fences:计算几何

Closed Fences A closed fence in the plane is a set of non-crossing, connected line segments with N corners (3 < N < 200). The corners or vertices are each distinct and are listed in counter-clockwise order in an array {xi, yi}, i in (1..N). Every pa

PSS/E v33.40 1CD(大型电力系统仿真计算软件)

1.PSS/E v33.40 1CD(大型电力系统仿真计算软件)PSS/E v33.40 1CD(大型电力系统仿真计算软件) PSS/E(Power System Simulator / Engineering) 是一款优秀的面向工程实际的仿真分析软件.自1976年面世以来,历经多次更新和完善,至今已发行version33. 目前挂靠siemens名下. 2.Plexim.PLECS.Standalone.&.Blockset.v3.4.6.Win32_64 4CD 著名瑞士电力电子仿真plec