USACO 6.4.2 Electric Fences 三分算法

Usaco Training Section 6.4 Electric Fences Electric Fences 电网 农夫约翰已经决定建造电网.他已经把他的农田围成一些奇怪的形状,现在必须找出安放电源的最 佳位置. 对于段电网都必须从电源拉出一条电线.电线可以穿过其他电网或者跨过其他电线.电线能够以任 意角度铺设,从电源连接到一段电网的任意一点上(也就是,这段电网的端点上或者在其之间的任意 一点上).这里所说的“一段电网”指的是呈一条线段状的电网,并不是连在一起的几段电网.若... 阅读详情

http://train.usaco.org/usacoprob2?a=gY0nBCREMEt&S=fence3

题目大意:用两点坐标形式给出平面内F条线段(平面为(0,0)到(100,100), F小于等于150),求出平面内一点使得从该点连向所有线段的距离最小(可以和线段上任意一点相连)且平面内的各种线可以任意交叉


解题思路:

一开始查到了模拟退火的解法,吓了我一跳,后来查到了这个亲民的解法:

https://www.cnblogs.com/albert7xie/p/5736315.html


这道题目一下子放在平面下又是小数坐标又是点与线段的三种位置情况的可能难有头绪,这时候我们就可以将其退化到直线上观察,发现直线上任意点到已知点的距离综合与该点的坐标是成一个二次函数的关系,我们就可以推导出在平面中当一个坐标固定时,点到所有线段的距离与另一个坐标也是成开口向上的二次函数的关系,如此一来我们就可以用教科书般的三分方法在一个坐标固定时求出另一个坐标的最佳位置和对应的最短距离。

至于固定的那个坐标,我们可以发现,当一个坐标固定时的最小距离与这个固定的坐标也是一个开口向上的二次函数关系(设(x0, y0)是最小值点,有x1>x0,y1是x=x1时的最小值位置,则f(x1, y1)>f(x0, y1)>=f(x0, y0))所以可以用三分套之前的三分。

至于计算点到线段的距离,我们可以先通过点乘来确定其位置关系,再视情况直接计算点与点的距离或通过叉乘获得最短距离


/*
ID: frontie1
TASK: fence3
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

double square(double num)
{
    return num*num;
}

double crossproduct(double a_x, double a_y, double b_x, double b_y)
{
    return (a_x*b_y - a_y*b_x);
}

double dotproduct(double a_x, double a_y, double b_x, double b_y)
{
    return (a_x*b_x +a_y*b_y);
}

double dist(double a_x, double a_y, double b_x, double b_y)
{
    return(sqrt(square(a_x-b_x)+square(a_y-b_y)));
}

struct line
{
    double a_x, a_y;
    double b_x, b_y;

    double length()
    {
        return(sqrt(square(a_x-b_x)+square(a_y-b_y)));
    }

    double distance(double x, double y)
    {
        if(dotproduct(a_x-b_x, a_y-b_y, x-b_x, y-b_y) <= 0) return dist(x, y, b_x, b_y);
        if(dotproduct(b_x-a_x, b_y-a_y, x-a_x, y-a_y) <= 0) return dist(x, y, a_x, a_y);
        else return(abs(crossproduct(b_x-a_x, b_y-a_y, x-a_x, y-a_y))/(this->length()));
    }
};

int F;
line fence[160];
double output_x, output_y, output_dist = 0x3f3f3f3f;

double get_total(double x, double y)
{
    double output = 0;
    for(int i = 0; i < F; ++i){
        output += fence[i].distance(x, y);
    }
    return output;
}

double try_y(double x)
{
    double lo = 0, hi = 100;
    double mid, midmid;
    double tem1, tem2, output;
    while(hi-lo >= 0.01){
        mid = (lo+hi)/2;
        midmid = (mid+hi)/2;
        tem1 = get_total(x, mid);
        tem2 = get_total(x, midmid);
        if(tem1 > tem2) lo = mid;
        else hi = midmid;
    }

    output = get_total(x, hi);
    if(output < output_dist){
        output_dist = output;
        output_x = x;
        output_y = hi;
    }
    return output;
}

void try_x()
{
    double lo = 0, hi = 100;
    double mid, midmid;
    double tem1, tem2;
    while(hi-lo >= 0.01){
        mid = (lo+hi)/2;
        midmid = (mid+hi)/2;
        tem1 = try_y(mid);
        tem2 = try_y(midmid);
        if(tem1 > tem2) lo = mid;
        else hi = midmid;
    }
}


int main()
{
    freopen("fence3.in", "r", stdin);
    freopen("fence3.out", "w", stdout);

    cin >> F;
    for(int i = 0; i < F; ++i){
        cin >> fence[i].a_x >> fence[i].a_y >> fence[i].b_x >> fence[i].b_y;
    }

    try_x();

    printf("%.1lf %.1lf %.1lf\n", output_x, output_y, output_dist);
    //cout << output_dist << ' ' << output_x << ' ' << output_y << endl;

    return 0;
}

【计算几何 皮克定理】P2735 [USACO3.4] 网 Electric Fences|普及 在本题中,格点是指横纵坐标皆为整数的点。 为了圈养他的牛,Farmer John 建造了一个三角形的电网。他从原点 $(0,0)$ 牵出一根通电的电线,连接格点 $(n,m)$($0\le n<32000,0<m<32000$),再连接格点 $(p,0)$($p>0$),最后回到原点。 牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分瘦的牛)。如果一个格点碰到了电网,牛绝对不可以被放到该格点之上(或许 Farmer John 会有一些收获)。那么有多少头牛可以被放到农夫约翰的电网中去呢? 阅读详情

相关推荐

CFturbo 2024保姆级教程:从流量扬程到三维叶轮,手把手搞定离心泵水力设计

本文提供CFturbo 2024离心泵水力设计的全流程实战指南,从流量扬程参数输入到三维叶轮模型导出,详细解析设计步骤与优化技巧。涵盖叶轮尺寸确定、子午面型线设计、叶片角度调整等关键环节,帮助工程师高效完成CAE辅助的离心泵水力设计,提升设计质量与效率。

weixin_42569329的博客 927

[Usaco2016 Feb] Load Balancing

平面上有N个点。现在要划两条分别平行于x轴y轴的直线,使得四个部分的点数的最大值趋于最小。O(N²logN)解法请点击:lookas2001这里有一个加强版——N≤1e5,我们就要用更高效的算法去解决。首先依旧把所有坐标离散。我们枚举一条分割线,至多枚举N次。(比如说枚举每一条horizontal line)那么就把这个平面分成上下两部分。上面n1个,下面n2个。(n1 + n2 = n)一条ve...

呆头呆脑没有烦恼 522

中科蓝讯AB536X/AB892X芯片开发避坑指南:Downloader配置中那些容易忽略的细节

本文详细解析中科蓝讯AB536X/AB892X芯片开发中Downloader配置的关键细节,包括软开关机实现、触摸灵敏度调试、量产校频等常见问题。特别针对无PR口芯片的替代方案、触摸参数优化、校频流程等易忽略环节提供实用解决方案,帮助开发者规避量产风险,提升开发效率。

weixin_30687051的博客 475

[USACO08NOV]玩具Toys

第一次发题解,如果有写的不清晰的地方,还请各位指出来owo(为什么这道题之前就只有一篇题解啊emm) 算法:三分+贪心 1.读题之后的第一件事是明确目标和问题: 第一步有同学可能会往DP的方向思考(比如蒟蒻我)。因为我们要处理的问题是我需要买多少个玩具,并且每天分别分多少个给n1,多少个给n2才能使得总和最小。 但是,在DP之前一定要仔细想一想,有一个算法也可以处理部分DP问题但是比DP更优秀,那...

baijiuhao的博客 345

告别手绘!用Aseprite+Unity Tilemap,从AI生成到2D游戏地图的保姆级搭建流程

本文详细介绍了如何利用Aseprite和Unity Tilemap从AI生成素材到搭建2D游戏地图的完整流程。涵盖AI生成素材的预处理、图层管理、动画制作,以及Unity中的Tilemap系统配置和性能优化技巧,帮助开发者高效创建像素风游戏地图。

weixin_29015483的博客 582

PCIe ATS介绍

主机侧使用IOMMU完成设备地址到物理memory地址的转换,以及设备访问权限的检查。但如果所有PCIe设备都在进行DMA操作,则TA(Translation Agent)和ATPT(Address Translation and Protection Table)则会成为瓶颈,从而影响系统的latency。

maxwell2ic的博客 6021

USACO 2007 Open Gold/acwing2240:餐饮 (拆点+最大流)‘三分图匹配’

原题链接:acwing2240:餐饮 题目大意 有n头牛,f种食物d种饮料,每头牛都只吃喜欢的食物和饮料,现在有f种食物和d种饮料各一个,要给每头牛喂吃的和饮料,要求有吃有喝的牛数量最大是多少。 思路 看到给牛匹配食物和饮料,就想到了二分图匹配问题,但此处要同时匹配食物和饮料,所以就变成了三个部分,相当于三分图匹配问题。 ...

harry12138小白的博客 689

深入了解torch框架

大国的游戏,政府支持到位,是未来;AI : Artificial Intelligence,旨在研究、开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统,是一种拥有自主学习和推理能力的技术。它模仿人类大脑某些功能,包括感知、学习、理解、决策和问题解决。AI本质​ NLP(说话,听)、CV(眼睛)、自动驾驶、机器人(肢体动作)、大模型三要素:数据、网络、算力① 神经网络:找到合适的数学公式;② 训练:用已有数据训练网络,目标是求最优解;③ 推理:用模型预测新样本;PyTorch,简称Torch

qq_74732076的博客 1135

Electric Fences_usaco3.4_皮克定理

Description给定两个整点(m,n)(m,n)和(p,0)(p,0),与坐标原点(0,0)(0,0)构成三角形,求三角形内的整点数量Analysis找到这么一道神奇的题目以及神奇的定理 皮克定理 一个计算点阵中顶点在格点上的多边形面积公式:S=a+b2−1S=a+\frac{b}{2}-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积

olahiuj的博客 711

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 486

AutoSAR配置视频讲解:总目录

AutoSAR实验视频讲解:闪烁一颗LED实验【总目录】 欢迎大家来到雪云飞星的《AutoSAR实验视频讲解》,本专栏是一个关于AutoSAR的闪烁LED灯的实验课程,一共8节课,每节课的视频都放在文章最后,传送门如下: 前言 AutoSAR实验视频讲解:简介 EB 的Mcal配置 AutoSAR实验视频讲解:Mcal配置 DaVinci Cfg配置 AutoSAR实验视频讲解:新建DaVinci工程 AutoSAR实验视频讲解:Os配置(预计2021-3-10更新) AutoSAR实验视频讲解:检查校验报

雪云飞星的博客 2万+

打卡信奥刷题(322)用Scratch图形化工具信奥P2735 [普及组/提高组] [USACO3.4] 网 Electric Fences

在本题中,格点是指横纵坐标皆为整数的点。为了圈养他的牛,农夫约翰(Farmer John)建造了一个三角形的电网。他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0

Loge谈信奥--一个专注于信奥人的博客 1985

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 598

打卡信奥刷题(1250)用C++信奥 P2735 [USACO3.4] 网 Electric Fences

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

Loge谈信奥--一个专注于信奥人的博客 4892

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

打卡信奥刷题(1243)用C++实现信奥 P2735 [USACO3.4] 网 Electric Fences

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

Loge谈信奥--一个专注于信奥人的博客 4918

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

USACO Electric Fences 解题报告

这道题还是没思路,大致搜了下才知道是局部搜索。由于

thestoryofsnow的专栏 784

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

usaco6.4.2 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 l

max_kibble的博客 397

Electric Fences[USACO]

非随机版的模拟退火 /* ID: zhangyc1 LANG: C++ TASK: fence3 */ #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> using names...

weixin_30677475的博客 177

[USACO 6.4.2] Electric Fences

题目大意   给出F条线段,这些线段所在的直线和X或Y轴平行.要求一点到这些线段的距离之和最短.注意: 这里的点和线段的距离是指点到线段上某一点使得它们连成线段最短的长度. 题解   我们先不要考虑这么复杂的问题先.先考虑一下简单规模的.也就是说在一条轴上的情况.   也就是说这里的线段会变成轴上的一点.如果我们要求此轴上一点使得此点到其它已给出的点距离之和最短.那么有人或许会说,很简单啊...

weixin_30409849的博客 123

usaco 5.2 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

志当存高远 1944

USACO SECTION 5.2 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

547

洛谷 P2735 [USACO3.4]网 Electric Fences

pick定理

engineoid的博客 279

USACO6.4.2 Electric Fences(fence3)

枚举 题目范围不大,精度要求不高,将整个连续空间离散分成1000个每个相距0.1的点,枚举每个点,能找到答案,复杂度高,是可以优化的 二分,每次枚举9个点 ( 正方形平均的9个点 ),找到最有点后再以这个点为九个点的中心点缩小步长再尝试9个点,直到枚举的两点间相差 求出一个点到某线段的最短距离,要分两种情况: 一是这个点做垂线会落到这个线段上,这种情况用差乘求出这个点与线段

xsy_victory的专栏 609

usaco traini 5.2.2 Electric Fences 题解

【序言】这个题目真的是太神了!它适合任何非主流的算法(特别是随机化算法)。从此,我对模拟退火、爬山法等有了更深的了解。 【优化】因为只要保留一位小数,我们可以把它扩大10倍当整数计算,输出时再缩小即可。 【验证方法】假设我们已经知道了某个点X的坐标,现在要求电线的总长度。那么我们可以用O(N)的效率求出。每次枚举一条线段Y,如果X到Y可以有垂直线段,电线的长度就是这垂线段;否则枚举线段的两个端点,最短值肯定是其中之一。>>>>>>>>最关键的是,如何知道X的坐标呢? 【算法一】枚举。当然不是纯枚举,否则效率

阿蒋的专栏 2263

USACO Section 5.2 Electric Fences - 有意思的枚举+计算几何

这题一上来首先想到的是能否用数学方法来求得这个点..比如说画一个半径最小的圆使其与所有线段相交或相切…那么圆心就是所求..想法似乎没问题..但怎么来求是毫无头绪~想了良久也没想出用数学的方法如何实现…       还是用枚举了…题目范围不大..并且精度要求不高..将整个( 0 , 0 ) ~ ( 100 ,100 ) 的连续空间离散分成1000个每个相距0.1的点..枚举每个点..定能找到答案.

zzyzzy12 1452

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 loca...

weixin_30824479的博客 192
上一篇: USACO 6.4.1 The Primes 搜索剪枝
下一篇: USACO 6.4.1 Wisconsin Squares 暴力
Frontier_Setter
博客等级 码龄10年 2粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值