[USACO Dec08]巨大的围栏Largest Fence解题报告

USACO4.1.2Fence Rails栅栏的木料解题报告 描述: 农民John准备建一个栅栏来围住他的牧场。他已经确定了栅栏的形状,但是他在木料方面有些问题。当地的杂货储存商扔给John一些木板,而John必须从这些木板中找出尽可能多所需的木料。 当然,John可以切木板。因此,一个9英尺的木板可以切成一个5英尺和一个4英尺的木料 (当然也能切成3个3英尺的,等等)。John有一把(完美的)梦之锯,因此他在切木料时,不会有木料的损失。 阅读详情

题目


分析

这是道挺有意思的计算几何题……

算法就是:枚举凸包的最左下点B,然后将所有合法的点按相对于B的极角序排序,这样凸包上的点一定是顺序选的。然后记忆化搜索:设状态f(B,p2,p3)代表:最左下点为B,凸包上选的最后一个点为p2,正在测试选不选p3.那么有两种转移:①不选p3,将p3改为p2->p3这条射线沿逆时针旋转卡到的第一个点。②选p3,将p2改为p3,p3改为以p3为起点,方向为p2->p3的射线沿逆时针旋转卡到的第一个点。


这个过程很像是Graham和卷包裹法的某种综合。


“卡到的第一个点”暴力计算是O(N^3)的,那么如果在每次枚举B时都计算一次会是O(N^4)的。不过实际上我们只需要开始计算一下,记忆化搜索中跳过那些不合法的点即可。


ps:我怎么也开始写意识流题解了……身败名裂……

pps:我擦,意识流题解真省事……


代码

<span style="font-size:14px;">#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int SIZEN=310,INF=0x7fffffff/2;
class Point{
public:
	int x,y;
	Point(int _x=0,int _y=0){
		x=_x;
		y=_y;
	}
};
void print(const Point &p){
	cout<<"("<<p.x<<" "<<p.y<<")";
}
bool cmp_coor(const Point &a,const Point &b){
	if(a.y==b.y) return a.x<b.x;
	return a.y<b.y;
}
Point operator - (const Point &a,const Point &b){
	return Point(a.x-b.x,a.y-b.y);
}
int cross(const Point &a,const Point &b){
	return a.x*b.y-b.x*a.y;
}
int N;
Point P[SIZEN];
int from_scan[SIZEN][SIZEN]={0},to_scan[SIZEN][SIZEN]={0};
//直观地想象"一个引出扫描射线的转动枢轴......"例如机械式雷达的波束
void prepare(void){
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			if(i==j) continue;
			//如果没有"三点不共线"的条件,这段可能有潜在问题
			int t1=0,t2=0;
			for(int k=1;k<=N;k++){
				if(k==i||k==j) continue;
				if(cross(P[j]-P[i],P[k]-P[i])>0){
					if(t1==0||cross(P[k]-P[i],P[t1]-P[i])>0) t1=k;
				}
				if(cross(P[j]-P[i],P[k]-P[j])>0){
					if(t2==0||cross(P[k]-P[j],P[t2]-P[j])>0) t2=k;
				}
			}
			from_scan[i][j]=t1;
			to_scan[i][j]=t2;
		}
	}
}
bool valid[SIZEN]={0};
int dp[SIZEN][SIZEN];
int del_step(const int &p1,int p2,int p3){//不选p3
	int x=from_scan[p2][p3];
	while(x&&!(valid[x]&&cross(P[p2]-P[p1],P[x]-P[p1])>0)){
		if(x==p3||x==p1) return 0;
		x=from_scan[p2][x];
	}
	if(!x||x==p3||x==p1) return 0;
	if(cross(P[p3]-P[p2],P[x]-P[p2])>0) return x;
	else return 0;
}
int sel_step(const int &p1,int p2,int p3){//选p3
	int x=to_scan[p2][p3];
	while(x&&!(valid[x]&&cross(P[p3]-P[p1],P[x]-P[p1])>0)){
		if(x==p3||x==p1) return 0;
		x=from_scan[p3][x];
	}
	if(!x||x==p3||x==p1) return 0;
	if(cross(P[p3]-P[p2],P[x]-P[p3])) return x;
	else return 0;
}
int DFS(const int &p1,int p2,int p3){//凸包起点p1,目前钦定了p2,待探查p3
	if(!p2||!p3) return -INF;
	//p1它其实是确定的......
	if(cross(P[p1]-P[p2],P[p3]-P[p2])>0) return -INF;
	int &ans=dp[p2][p3];
	if(ans!=-1) return ans;
	ans=1;//直接结束凸包
	ans=max(ans,DFS(p1,p3,sel_step(p1,p2,p3))+1);
	ans=max(ans,DFS(p1,p2,del_step(p1,p2,p3)));
	return ans;
}
int calc(int d){
	memset(dp,-1,sizeof(dp));
	for(int i=1;i<=N;i++) valid[i]=cmp_coor(P[d],P[i]);
	valid[0]=false;valid[d]=true;
	int ans=0;
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			if(valid[i]&&valid[j]&&cross(P[i]-P[d],P[j]-P[d])>0) ans=max(ans,DFS(d,i,j)+2);
		}
	}
	return ans;
}
void work(void){
	int ans=0;
	for(int i=1;i<=N;i++) ans=max(ans,calc(i));
	printf("%d\n",ans);
}
void read(void){
	scanf("%d",&N);
	for(int i=1;i<=N;i++) scanf("%d%d",&P[i].x,&P[i].y);
}
int main(){
	freopen("fence1.in","r",stdin);
	freopen("fence1.out","w",stdout);
	read();
	prepare();
	work();
	return 0;
}
</span>


BZOJ1591 USACO 2008 Dec Gold 4.Largest Fence Solution 题目大意: 求出平面上ngedian 阅读详情

相关推荐

usaco_fence3解题

usaco第五章fence3的解题代码,供算法初学者参考

P2924 [USACO08DEC]大栅栏Largest Fence

传送门 反正我是看不出来这题和凸包有什么关系……大佬们是怎么想到的…… 不准确一点的说,本题就是要我们求一个边上点数最多的凸包 我们可以先把所有的边都取出来,然后按极角排序。枚举这个凸包的起点,然后做dp即可 复杂度\(O(n^3)\) //minamoto #include<bits/stdc++.h> #define rint register int using namespac...

weixin_33756418的博客 216

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Bzoj1591:[Usaco2008 Dec]Largest Fence 最大的围栏:DP

题目链接:1591:[Usaco2008 Dec]Largest Fence 最大的围栏 显然不能枚举 考虑dp,每个点肯定都有一个包含他的最大的凸包 观察凸包,存在一条边使得顺时针看凸包上一圈的边极角是递增的,手画一个凸包就可以发现(三象限->四->一->二) 别告诉我你不知道极角是会有负数的 所以我们将点两两连边,将边按照极角排序 设f[i]为包含i的最大凸包上的点的数量,则f[j

蜜の夜明け 1150

PotPlayer自用皮肤

自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。

UE4 GamePlay框架深度解析:从蓝图到C++构建多人游戏核心

在游戏开发与实时交互应用领域,一套清晰、可扩展的底层框架是项目成功的关键。GamePlay框架作为虚幻引擎(UE4/UE5)的核心架构,定义了游戏世界中对象交互、状态管理与网络同步的基本原理。它通过职责分离的设计模式,将游戏规则(GameMode)、全局状态(GameState)、玩家状态(PlayerState)、可操控实体(Pawn/Character)及其控制器(Controller)等核心类有机组织起来,确保了逻辑的清晰性与多人游戏数据的一致性。其技术价值在于为开发者提供了一套经过验证的最佳实践,大

weixin_33924770的博客 617

usaco 3.3 fence 2008.11.7

usaco 3.3 fence 2008.11.7 program1:过六组,超时两组 { ID: PROG: fence LANG: PASCAL } program p_fence; const fin='fence.in';fout='fence.out'; var f1,f2:text; map:array[1..500,1..500]of longint;

Batman_的博客 393

QTableView实现表格加载百万条数据

本文介绍用QTableView实现加载100万条数据显示到表格。 1.创建工程 用Qt Creator创建Qt Widgets Application项目,基类选择QWidget,创建好了,如图: 2.添加QTableView控件 在widget.ui中添加QTableView控件,和QPushButton,采用栅格布局,如图: 3.添加函数 头文件 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Wid

丁爸的博客 8271

USACO算法系列十四——fence

    题目:http://www.nocow.cn/index.php/Translate:USACO/fence    看完这道题目的第一想法就是,遍历所有的边,而且每一条边的经过次数只能一次。

止于至善 717

Mission Planner连接Autopilot保姆级教程:从USB到无线全搞定

本文提供Mission Planner连接Autopilot的全面指南,涵盖USB直连、无线数传、蓝牙适配等多种连接方案。详细讲解驱动安装、波特率匹配、性能优化等关键步骤,并分享多链路冗余配置与故障转移的高阶技巧,助你快速解决连接问题。

weixin_28455801的博客 377

AIAgent知识表示与推理:基于本体论与规则引擎的实现

AIAgent知识表示与推理:基于本体论与规则引擎的实现 1. 背景介绍 人工智能(AI)系统的核心是知识表示和推理,这是实现智能行为的基础。在过去的几十年里,人工智能领域一直致力于研究如何有效地表示和推理知识,以支持智能系统的决策和行为。其中,基于本体论的知识表示和

AI天才研究院 1493

第一本docker书学习笔记1-3章

第一本docker书学习笔记1-3章.rar原书pdf下载 转载于:https://blog.51cto.com/382392/2386867

weixin_33756418的博客 169

从零到一:使用阿里云百炼搭建企业级 AI Agent 完全实战手册(2026超详细版)

本文是一份企业级AI Agent构建手册,主要面向企业技术负责人、AI产品经理和后端开发工程师。手册详细介绍了如何在阿里云百炼平台上搭建企业智能体应用的全流程,包括环境准备、知识库构建、智能体创建、工具集成、工作流编排等核心环节。重点内容包括: 准备工作:阿里云账号注册、百炼服务开通、免费额度领取、API Key管理 知识库构建:文档格式要求、内容优化原则、RAG系统搭建 智能体开发:Agent创建、工具集成、复杂业务工作流设计 生产部署:多渠道接入、监控运维、安全治理 成本控制:Token预算管理、选型决

u010323587的专栏 1084

BZOJ1591 & 洛谷2924:[USACO2008 DEC]Largest Fence 最大的围栏——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=1591 https://www.luogu.org/problemnew/show/P2924#sub 有n(5≤n≤250)个栅栏点,FJ需要围成一个栅栏圈,这个圈是一个凸包并且凸包上的点最多。 这题题解写的如此之玄幻,题目看起来如此之不可做…… 然而实际很简单……看了半天题解发现不...

weixin_34179968的博客 148

28.Anaconda安装jupyter notebook、jupyterlab及体验

手贱,不小心将Anaconda自带得jupyter给卸载了,没法子了查了好多资料都比较麻烦,所以自己摸索着重新安装,记录一下心得。说明:Anaconda没有加入环境变量,Anaconda官方建议不要将Anaconda加入环境变量,这就意味着他和python是可以共存的。

迷逝 5028

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 268

USACO-Section 3.4 Electric Fence (模拟)

第一反应就是按照解析几何的方法做,不过有很多特殊情况,比如会是垂直(n=0或p=0),(p<n或p>n) WA了几次才全部想到

idealism_xxm的专栏 1044

AI测试干货:Claude Code Skill 从入门到精通

本文介绍了Claude Code Skill功能如何解决AI重复工作问题。传统提示词方式需要人工复制粘贴,而Skill功能通过建立AI工作记忆库实现智能触发和分层加载。Skill包含工作指令、文档和资源,能自动执行任务。文章以API测试用例生成为例,展示了Skill的创建流程和结构化设计,包括测试框架、覆盖场景和输出格式,显著提升测试工程师的工作效率。

blues_C的博客 2439

洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(搜索_图的遍历)

传送门 似乎有点强连通的意思??? 直接搜吧,搜的时候记录第一次访问当前点的时间 如果一个点后继牛棚是自己,则形成自环,答案为1 如果一个点在环中且不是自环,则答案为环的大小=第二次搜到当前点的时间-第一次搜到当前点的时间+1,用当前点的答案去更新环内其他点的答案 如果一个点不在环中,则当前点往前搜一定会搜到一个环,递归时更新答案,为当前点的后继牛棚的答案加一。 Code: #i...

Dawn_LLLLLLL 434

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Usaco】Fence8

Description 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材。于是农夫约翰到木材店购买木材。可是木材店老板说他这里只剩下少部分大规格的木板了。不过约翰可以购买这些木板,然后切割成他所需要的规格。而且约翰有一把神奇的锯子,用它来锯木板,不会产生任何损失,也就是说长度为10的木板可以切成长度为8和2 的两个木板。 你的任务:给你约翰所需要的木板的规格,还有木

HHH的专栏 910

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

USACO 3.4.1 closed fence

       不得不承认这道题着实是一道好题,可惜当年我还在用PASCAL的时候压根没做这道题……具体详情我想我是需要追究matt和s.p.willam(原skyprophet)两位神牛的责任的……      这个东西比较困难,我也不知道完美算法是什么(或者压根没有完美算法???),于是我祭出了近似算法。这道题目的第一问就是简单的判断线段是否相交,非常简单。由于n最大是200,所以就不用考虑O

inc(Arthur's fighting) 671

「几何」[USACO12DEC]疯狂的栅栏Crazy Fences

[USACO12DEC]疯狂的栅栏Crazy Fences 题目链接:[USACO12DEC]疯狂的栅栏Crazy Fences 题目大意 给你\(n\)个坐标,每个坐标包含四个位置信息 \(x_1,y_1,x_2,y_2\) 然后\(x_1,y_1\) 与 \(x_2, y_2\)通过一条直线连接,再给你 \(m\) 个坐标,每个坐标两个字母\(x_1, y_1\)分别代表牛的位置,每...

bachayou2102的博客 556

USACO 3.4 Closed Fences (fence4)

/* Main idea: 1.判断多边形是否合法 任两条边都不相交即合法,注意这里的相交是严格相交,顶点相交不算相交。 2.二分法判断当前线段 seg_a 是否可见 假设观察点为 eye,seg_a 的两个端点分别为st 和 end。判断视线(eye,st)和(eye,end)是否 与其他线段(即 fence)相交。 如果都不相交,则seg_a 可见。 如果两视线均与某一 fence 相交,则s

Hello World! 1860

USACO 4.1 Fence Loops (fence6)

/* 这题是求无向图中的一个最小环的长度。 主要思路是:因为边都是直线,边的两点之间的最短距离必然是这个边长。那么, 再求一条到两顶点的最短距径,这个路径与边构成了一个环。这个环是包含该边的最小环。 枚举一下所有边,计算出最小环即可。对于每个边,删除该边,然后计算两顶点的最短路径,再恢复该边。 但是这个图的输入是用边表示的,一个难点就是将其转换成用点表示。这里用边的集合来表示一个点

Hello World! 1811

栅栏的木料(二分+dfs)

题目描述 Description 农民John准备建一个栅栏来围住他的牧场。他已经确定了栅栏的形状,但是他在木料方面有些问题。当地的杂货储存商扔给John一些木板,而John必须从这些木板中找出尽可能多所需的木料。 当然,John可以切木板。因此,一个9英尺的木板可以切成一个5英尺和一个4英尺的木料 (当然也能切成3个3英尺的,等等)。John有一把(完美的)梦之锯,因此他在切木料

clover_hxy的博客 1339
上一篇: [USACO Nov08]玩具toys解题报告
下一篇: [USACO Jan09]安全路径Safe Travel解题报告
wmdcstdio
博客等级 码龄12年 76粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值