usaco6.4.2 Electric Fences

Usaco Training Section 6.4 Electric Fences 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 wire must run from some point on each and every fence to the source of electricity. Wires can run through other fences or across other wires. Wires can run at any angle. Wires can run from any point on a fence (i.e., the ends or anywhere in between) to the electrical supply.

Given the locations of all F (1 <= F <= 150) fences (fences are always parallel to a grid axis and run from one integer gridpoint to another, 0 <= X,Y <= 100), your program must calculate both the total length of wire required to connect every fence to the central source of electricity and also the optimal location for the electrical source.

The optimal location for the electrical source might be anywhere in Farmer John's field, not necessarily on a grid point.

PROGRAM NAME: fence3

INPUT FORMAT

The first line contains F, the number of fences.
F subsequent lines each contain two X,Y pairs each of which denotes the endpoints of a fence.

SAMPLE INPUT (file fence3.in)

3
0 0 0 1
2 0 2 1
0 3 2 3

OUTPUT FORMAT

On a single line, print three space-separated floating point numbers, each with a single decimal place. Presume that your computer's output library will round the number correctly.

The three numbers are:

  • the X value of the optimal location for the electricity,
  • the Y value for the optimal location for the electricity, and
  • the total (minimum) length of the wire required.

SAMPLE OUTPUT (file fence3.out)

1.0 1.6 3.7



二 分析

题意是在直角坐标系中给定F条线段,每条线段的端点都在[0, 100]之间,要求找到一个点,使得这个点到所有线段的距离之和最小。要求点的坐标精确到小数点后一位。

思路是先用较大的步幅找到结果的大致位置,逐步缩小步幅,最终确定答案。详见代码。


三 代码

运行结果:
USER: Qi Shen [maxkibb3]
TASK: fence3
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 4328 KB]
   Test 2: TEST OK [0.000 secs, 4328 KB]
   Test 3: TEST OK [0.000 secs, 4328 KB]
   Test 4: TEST OK [0.000 secs, 4328 KB]
   Test 5: TEST OK [0.014 secs, 4328 KB]
   Test 6: TEST OK [0.014 secs, 4328 KB]
   Test 7: TEST OK [0.014 secs, 4328 KB]
   Test 8: TEST OK [0.014 secs, 4328 KB]
   Test 9: TEST OK [0.014 secs, 4328 KB]
   Test 10: TEST OK [0.014 secs, 4328 KB]
   Test 11: TEST OK [0.028 secs, 4328 KB]
   Test 12: TEST OK [0.028 secs, 4328 KB]

All tests OK.

YOUR PROGRAM ('fence3') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.


AC代码:
/*
ID:maxkibb3
LANG:C++
PROB:fence3
*/

#include<iostream>
#include<fstream>
#include<vector>
#include<cmath>
#include<iomanip>

using namespace std;

struct Point {
    double x, y;
    Point() {}
    Point(double xx, double yy) : x(xx), y(yy) {}
};

const double rate = 0.98;
const double eps = 1e-8;
const double inf = 1e99;

ifstream fin("fence3.in");
ofstream fout("fence3.out");

int n;
vector<Point> s, t;
Point o;
double ans = inf, tem = 100;
int dx[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

double cross(Point a, Point b, Point c) {
    return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
}

double multi(Point a, Point b, Point c) {
    return (b.x - a.x) * (c.x - a.x) + (b.y - a.y) * (c.y - a.y);
}

double p2pDis(Point a, Point b) {
    return sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));
}

// line is determined by Point a & b
double p2lDis(Point a, Point b, Point c) {
    if(p2pDis(a, b) < eps) return p2pDis(a, c);
    if(multi(a, b, c) < -eps) return p2pDis(a, c);
    if(multi(b, a, c) < -eps) return p2pDis(b, c);
    return fabs(cross(a, b, c) / p2pDis(a,b));
}

double getDis(Point x) {
    double ret = 0;
    for(int i = 0; i < n; i++)
        ret += p2lDis(s[i], t[i], x);
    return ret;
}

void search() {
    o = Point(s[0].x, s[0].y);
    ans = getDis(o);
    while(tem > eps) {
        bool flag = true;
        while(flag) {
            flag = false;
            for(int i = 0; i < 4; i++) {
                Point p;
                p.x = o.x + dx[i][0] * tem;
                p.y = o.y + dx[i][1] * tem;
                double dis = getDis(p);
                if(dis < ans) {
                    ans = dis;
                    o = p;
                    flag = true;
                }
            }
        }    
        tem = tem * rate;
    }
}

int main() {
    fin >> n;
    s.resize(n);
    t.resize(n);
    for(int i = 0; i < n; i++) {
        fin >> s[i].x >> s[i].y >> t[i].x >> t[i].y;
    }
    fin.close();
    
    search();

    fout << fixed << setprecision(1);
    fout << o.x << " " << o.y << " " << ans << endl;
    fout.close();

    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 会有一些收获)。那么有多少头牛可以被放到农夫约翰的电网中去呢? 阅读详情

相关推荐

深入解析音频信号处理的核心算法——傅里叶变换、语音增强、回声消除与主动降噪

本文系统介绍了现代音频信号处理的核心技术。首先阐述傅里叶变换作为理论基础的重要性,它能将声音分解为频域成分。随后重点分析三大关键技术:语音增强利用谱减法、维纳滤波和深度学习从噪声中提取人声;回声消除采用自适应滤波器消除通话中的回声;主动降噪通过声波干涉原理抵消环境噪声。文章最后指出,这些技术在实际应用中协同工作,形成完整的音频处理链路,共同提升语音质量和听觉体验。随着算法进步和算力提升,音频处理技术正向着更智能、更高效的方向发展。

程序猿老樊的博客 1328

USACO-Section3.4 Electric Fences【数学】

题目描述: 在本题中,格点是指横纵坐标皆为整数的点。 为了圈养他的牛,农夫约翰建造了一个三角形的电网。他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0&lt;=n&lt;32000,0 &lt; m&lt;32000),再连接格点(p,0)(p&gt;0),最后回到原点。 牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分苗条的牛)。如果一个格点碰到了电网,牛绝对不可以...

tjj1998的博客 448

【HSCNN解析】HSCNN:从欠采样光谱图重建高光谱图的CNN网络

本文介绍HSCNN,是一个将欠采样光谱图重建为高光谱图的纯CNN网络,2017年提出。

上个大学哪有不疯的?硬撑罢了! 1623

USACO6.4.2 Electric Fences(fence3)

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

xsy_victory的专栏 609

SHP转TXT、TXT转SHP工具(附工具下载链接)

关于TXT,可以选择整个图层生成一个TXT。也可以勾选“每个地块单独存TXT”,然后选择一个字段,根据字段值,给每个地块生成一个TXT文件。支持选择和数据框一样的坐标系,也可以选择一个图层,工具会采用和这个图层一样的坐标系。1、TXT数据支持输入单个或者多个TXT文件,也可以直接选择TXT所在的文件夹。所有的TXT数据都生成到一个矢量数据图层。关于这一行的内容,可以在地块坐标行设置中进行设置。其他:①面节点闭合:勾选,则回到起点。属性描述:可以直接复制粘贴进来,也可以直接修改。也可以改为任意字母。

坐听风雨 4303

亲友圈棋牌的逆向工程_棋牌透视分析研究(一)

透视也能实现,有些台子就自带控制,这种东西权限只是存在于平台运营者手中,即便逆向破解也很难发现,但也有那么一些棋牌 比如斗牛或者跑得快,会先发给你的内存中存放当前的牌的信息,这样你就可以知道对面的牌是什么,但肯定也是加密了。明明是zip却无法解压,这很明显是属于被加密了, 那么我们就要开始找他的加密内容,一般加密的秘钥都会存储在so里面。写这一篇文章了,其实也想了很久,最终还是决定写了, 有些朋友找我做过菠菜的逆向,bjl,甚至是足球的!但很遗憾的告诉大家,这里是找不到的。

m0_63368535的博客 5822

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

Visual Studio调试时遇到ntdll.dll的PDB文件缺失?别慌,这3个方法帮你搞定(附详细步骤)

本文详细解析了Visual Studio调试时ntdll.dll的PDB文件缺失问题,提供了3种实用解决方案:调整调试设置、配置符号服务器与缓存目录、手动下载管理符号文件。通过分步指导和高级技巧,帮助开发者快速恢复完整的调试功能,特别适用于Windows平台下的C++项目开发。

weixin_42537919的博客 513

usaco traini 5.2.2 Electric Fences 题解

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

阿蒋的专栏 2263

关于 Nginx 监听地址 0.0.0.0 的详细解释

0.0.0.0在Nginx配置中表示监听服务器所有网络接口(包括公网IP、内网IP和本地回环地址),这是默认配置。当使用listen 80;时,Nginx会接受通过服务器任何IP地址的80端口访问请求。相比只监听特定IP,这种配置更通用,但也意味着服务会对外网开放,需注意安全风险。可通过netstat命令验证监听状态,显示0.0.0.0:80即表示正确配置。

weixin_43674738的博客 1567

基于LSTM GRU RNN的交通流量预测-完整数据代码

基于LSTM GRU RNN的交通流量预测-完整数据代码

923

USACO 6.4.2 Electric Fences 三分算法

http://train.usaco.org/usacoprob2?a=gY0nBCREMEt&amp;S=fence3题目大意:用两点坐标形式给出平面内F条线段(平面为(0,0)到(100,100), F小于等于150),求出平面内一点使得从该点连向所有线段的距离最小(可以和线段上任意一点相连)且平面内的各种线可以任意交叉解题思路:一开始查到了模拟退火的解法,吓了我一跳,后来查到了这个亲民的解法...

Frontier_Setter的博客 445

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

Sugar_wolf的博客 275

[USACO 6.4.2] Electric Fences

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

weixin_30409849的博客 123

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

打卡信奥刷题(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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

打卡信奥刷题(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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

USACO Electric Fences 解题报告

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

thestoryofsnow的专栏 784

Electric Fences[USACO]

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

weixin_30677475的博客 177

洛谷 P2735 [USACO3.4]网 Electric Fences

pick定理

engineoid的博客 279

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

USACOTraining 3.4.3 Electric Fences电网 题解

Electric Fences电网 描述 在本题中,格点是指横纵坐标皆为整数的点。 为了圈养他的牛,农夫约翰建造了一个三角形的电网。他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(00),最后回到原点。 牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分苗条的牛)。如果一个格点碰到了电网,牛绝对不可以被放到该格点之上。那么有多少头牛可以被放到农夫约翰的电网中去呢

初学者 1606

[USACO3.4.3 Electric Fences]

[关键字]:数学 解析几何 [题目大意]:给出n,m,p,问由(0,0)(n,m)(p,0)围成的三角形型内部有几个由整数构成的点。 //============================================================================================= [分析]:据说有个皮克定律可以解决,但是本菜不会……所以就用了最笨的...

weixin_30336061的博客 176

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

weixin_30419799的博客 159

Electric Fences (fence3)[USACO 5.2.2]

算法:随机化 分析:随机化真的很恶心的说~总之这道题就折腾了我半天,但是还好我A了。      网上说的大部分都是随机化(SA算法),但是本菜不会,于是看代码,最后还是有那么点理解。      首先因为坐标不一定是整数,而是带着一位小数,所以我就先把所有的坐标都乘10,

343

P2735 电网 Electric Fences

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

weixin_30855099的博客 201
上一篇: usaco6.3.3 Cowcycles
下一篇: poj 2442 Sequence
max_kibble
博客等级 码龄11年 2粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值