POJ 1873 The Fortified Forest 计算凸包

matlab代码尝试用HT原理检测图形中可共直线的点个数 根据图像处理中hough转换的原理 从实际能运行的代码中修改得到能检测出图形中可共直线的点 并可改为显示2 3 4 点共线段 立即下载

题目描述:http://poj.org/problem?id=1873


题目大意:

一片森林中有n棵树,现在需要砍掉其中的一些树做成围栏把剩下的树围起来。给定每棵树的(x,y)坐标、价值和砍掉之后能做成围栏的长度。找到最优的一种可行方案使得砍掉的树的价值最小。如果两种方案砍掉树的价值相同,则选择砍掉数目数量少的哪一个方案。

多组数据,2 <= n <= 15。


解题思路:

看到n的范围马上想到枚举。枚举每棵树砍掉或者不砍,算出砍掉的树能做成围栏的长度length 和 剩下的树的凸包长度fence,如果length>=fence那么可行,然后在所有可行解中取最优解。


知识点:

枚举、计算凸包。


总结:

思路很简单,但是WA了几次。原因是计算凸包写错了。

我用的是对xy坐标排序的graham-scan算法,在排序时只对x坐标排序,对y不排序,然后在构造过程中判断是否左转的时候把共线也判断成左转。这样写的话计算出的凸包没有问题,凸包的边上三点共线时会把中间的点踢掉。

还有一种情况是不把共线判断为左转,这样的话计算出的凸包就会有共线的点。但是要求排序时对xy双关键字排序,不然会出错。

所以以后还是老老实实写双关键字的排序吧。如果需要构造有三点共线的凸包,那么判断左转时不加=0。如果构造含无三点共线的凸包,判断左转时加上=0。

/*
 *
 *	Problem: 1873		
 *	Memory: 192K		Time: 547MS
 *	Language: C++		Result: Accepted
 *
 */

#include "stdio.h"
#include "math.h"
#define MAXN 17
#define EPS 1e-8
#define INFV 99999999

struct Point {
	double x, y;
}p[MAXN];

struct Tree {
	struct Point p;
	int v;
	int l;
}t[MAXN];


bool cut[MAXN];
int minValue, top, n;
double extra;
int ansList[MAXN], ansn;

void sort(int l, int r) {
	int i=l, j=r;
	double x = p[(l+r)>>1].x, y = p[(l+r)>>1].y;
	do {	
		while (p[i].x<x || (p[i].x==x && p[i].y<y)) i++;
		while (p[j].x>x || (p[j].x==x && p[j].y>y)) j--;
		if (i<=j) {
			Point t = p[i];
			p[i] = p[j];
			p[j] = t;
			i++; j--;
		}
	} while (i<=j);
	if (i<r) sort(i, r);
	if (l<j) sort(l, j);
}

void init() {
	minValue = INFV;
	ansn     = n+1;
	for (int i=1;i<=n;i++) {
		scanf("%lf %lf %d %d", &t[i].p.x, &t[i].p.y, &t[i].v, &t[i].l);
	}
}

bool turnLeft(struct Point a, struct Point b, struct Point c) {
	double x1 = b.x-a.x, y1 = b.y-a.y;
	double x2 = c.x-a.x, y2 = c.y-a.y;
	return x1*y2-x2*y1>=0;   
}

double dis(struct Point a, struct Point b) {
	return sqrt(pow(a.x-b.x, 2) + pow(a.y-b.y, 2));
}

double convexHull() {
	double ans = 0;
	struct Point q[MAXN];
	int    n1 = 0;

	sort(1, top);
	
	q[1] = p[1]; n1 = 1;
	for (int i=2; i<=top; i++) {
		while (n1>=2 && turnLeft(q[n1-1], q[n1], p[i])) n1--;
		q[++n1] = p[i];
	}
	for (int i=1; i<n1; i++) ans += dis(q[i], q[i+1]);

	q[1] = p[top]; n1 = 1;
	for (int i=top-1;i>=1;i--) {
		while (n1>=2 && turnLeft(q[n1-1], q[n1], p[i])) n1--;
		q[++n1] = p[i];
	}
	for (int i=1; i<n1; i++) ans += dis(q[i], q[i+1]);

	return ans;
}

void dfs(int dp) {
	if (dp == n+1) {
		double length = 0;
		int cnt   = 0; 
		int value = 0;
		top = 0;
		for (int i=1;i<=n;i++) 
		if (cut[i]) {
			length  += t[i].l;
			value   += t[i].v;
			cnt     ++;
		} else {
			p[++top] = t[i].p;
		}
		double fence = convexHull(); // 剩下的树构成的凸包长度
		if (fence-length<=EPS && (value<minValue || (value==minValue && cnt<ansn))) {
			minValue = value;
			extra    = length - fence;
			ansn     = 0;
			for (int i=1;i<=n;i++) 
			if (cut[i]) ansList[++ansn] = i;
		}

	} else {
		cut[dp] = true;  dfs(dp+1);
		cut[dp] = false; dfs(dp+1);
	}
}

int main() {
	
	scanf("%d", &n);

	int t = 0;

	while (n) {

		t ++;

		init();

		// 习惯性写深搜了,也可以按位枚举
		dfs(1);

		printf("Forest %d\n", t);
		printf("Cut these trees: ");
		for (int i=1;i<=ansn;i++) printf("%d ", ansList[i]);
		printf("\n");
		printf("Extra wood: %.2lf\n", extra);
		printf("\n");

		scanf("%d", &n);

	}
	return 0;
}



Pylon SDK C语言多相机采集的注意事项、关键设置及代码示例 前言 与单相机直接用句柄PYLON_DEVICE_HANDLE hdev进行操作所不同的是,在多相机连接采用索引值访问每个相机,对应句柄为PYLON_DEVICE_HANDLE hdev[deviceIndex] 。若连接N个相机设备,则索引值范围为[0,...,N-1]。显而易见,采用循环结构编程可以对多个相机采用同样的操作,包括参数设置、图像采集等。但多个相机的使用需要根据相机功能、相机与主机间的连接方式、网络适配器进行额外的设置。本文参考Pylon C开发者手册和Basler产品文档,对GigE类型 阅读详情

相关推荐

电影台词预测类型:NLP小样本多标签分类实战

电影类型预测本质上是短文本语义建模问题,核心在于从高度碎片化、低语义密度的台词(平均仅12.7词)中挖掘隐含的类型学编码规则。其技术难点在于:需应对省略主语、倒装、拟声词等非规范表达;处理Drama与Comedy等类型强共现的多标签耦合;并克服领域迁移障碍——维基文本预训练模型在台词上性能骤降0.11。解决方案聚焦RoBERTa微调、类型感知注意力机制与标签平滑策略,兼顾小样本鲁棒性与业务可解释性,广泛适用于影视元数据标注、智能推荐系统及NLP教学实践。

weixin_33309048的博客 287

关于Matlab中函数minboundrect的报错解决,以及画出最小外接矩形的方法

目的:图像预处理之后,计算所有连通域的最小外接矩形的长和宽,根据长宽比以及面积作为阈值,筛选出符合条件的连通域,并画框。 问题:用函数 minboundrect 找出所有连通域的外接最小外接矩形的时候,报错! 报错内容:计算凸包时出错,这些点可能共线。 解决方法:利用函数 bwareaopen 初步移除小噪声的影响,具体实现如下: (1)经过灰度转化、边缘检测、腐蚀、膨胀、平滑轮廓一系列预处理,得到的图像如下图所示: (2)移除小噪声时,报错如下: (3)分析:凸包又.

Flying Bulldog 的博客 2752

【对比学习+分割】CRIS:CLIP驱动RIS图像分割(CVPR 2022)

CRIS: CLIP-Driven Referring Image Segmentation

这个博客太懒了什么都没说 3324

POJ-1873-The Fortified Forest(二进制枚举+凸包)

题目链接:http://poj.org/problem?id=1873 题目大意:给出n棵树的位置(x,y)坐标,价值v和长度l。让你从中选择一些树,砍掉他们将其他的树围起来。 要求砍的这些树的价值之和最小。按顺序输出砍的树。如果价值相同,输出砍的树最少的的方案。最后在输出一个:砍掉的这些树,围城围栏之后,还剩下多少长度的木头。 思路:一开始很懵逼的。。但是看数据范围这么小,还以为是状压DP...

永远鲜红の幼月的博客 663

用Python和NumPy可视化理解波函数:从概率密度到薛定谔方程的可视化教程

本文通过Python和NumPy实现量子力学波函数的可视化,从概率密度到薛定谔方程的动态演化,帮助读者直观理解量子态的特性。教程涵盖无限深势阱、量子谐振子等模型,结合代码示例展示时间演化和期望值计算,为量子力学学习提供实用工具。

weixin_27303545的博客 226

FairyGUI深度解析:Unity复杂UI开发的高效解决方案与性能优化

在Unity游戏和应用开发中,UI系统的性能与开发效率是核心挑战。原生UGUI的组件化模型在应对复杂、动态界面时,常面临Draw Call过高、层级管理臃肿的问题。其原理在于,每个UI元素对应一个GameObject,渲染合批受限于Transform层级与材质状态,易导致性能瓶颈。FairyGUI(FGUI)作为一种专业的第三方UI解决方案,其技术价值在于采用了截然不同的“舞台-显示对象”渲染模型。该模型通过内部轻量级对象管理与自主合批系统,实现了极高的运行时效率与Draw Call优化。在应用场景上,FG

weixin_31315567的博客 339

凸包问题的五种解法

前言: 首先,什么是凸包? 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。如下图: 然后,什么是凸包问题? 我们把这些点放在二维坐标系里面,那么每个点都能用 (x,y) 来表示。 现给出点的数目13,和各个点的坐标。求构成凸包的点? 解一:穷举法(...

baningtao1470的博客 3413

SRC漏洞挖掘实战:从攻击面管理到业务逻辑漏洞的精准狩猎

在网络安全领域,漏洞挖掘是识别和利用软件系统中安全弱点的核心实践。其基本原理在于通过系统化的方法,识别和评估一个应用或系统的攻击面,并从中定位安全防护的薄弱环节。这项技术的价值在于能够主动发现潜在风险,防患于未然,对于保障企业数字资产安全至关重要。典型的应用场景包括对Web应用、移动端API以及各类在线业务系统的安全性评估。在实际的漏洞挖掘,尤其是针对安全应急响应中心(SRC)的实战中,高效的策略往往聚焦于**边缘资产**的发现与利用,以及对**业务逻辑漏洞**的模式化测试。掌握这些经过验证的思路,能帮助安

babing2770的博客 414

The Fortified Forest(二进制暴力+ 凸包)呜呜呜~~,大佬们都好厉害

https://blog.youkuaiyun.com/Little_boy_z/article/details/78383415#commentBox推荐看这篇博客,里面写的很详细 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmat...

Autumn_ghost的博客 739

MEG预处理-Brainstorm

Brainstorm下载和安装 去Brainstorm官网进行下载:打开网页后,点击左侧Download;在跳出来的界面中进行简单的注册,注册完成后可以进行下载 解压后得到“brainstorm3”的文件夹,里面包含Brainstorm工具包的所有文件,把这个文件夹放在某个路径如"E:\matlab_tools\brainstorm3"即可 同样在某个路径建立空的文件夹命名为:brainstorm_db用于工具包运行过程中自动存储生成的文件,所以这个文件中生成的数据不要手动移动删除 在Matlab中,把.

AxeChen的博客 6119

Unreal使用nDisplay制作裸眼3D(9宫格)

摘要: nDisplay是虚幻引擎的分布式实时渲染技术,可将内容同步输出到多个显示设备(如LED墙、投影仪等),构建沉浸式可视化系统。其核心功能包括:分布式渲染(支持多台设备协同处理高分辨率内容)、空间透视校正(通过追踪观众动态调整画面几何关系)以及虚拟拍摄应用。配置时需设置集群组件(Cluster、Host、Node、Viewport)定义渲染逻辑,空间组件(nDisplayScreen、ViewPoint)确定投影关系。文中以9宫格配置为例,详细演示了从工程创建到影片渲染合成的全流程,最终通过多视口合成

TxNet 608

[poj1873]The Fortified Forest--计算几何,暴搜+凸包

题目描述 Once upon a time, in a faraway land, there lived a king. This king owned a small collection of rare and valuable trees, which had been gathered by his ancestors on their travels. To protect his ...

dark_dawn的博客 230

【24届秋招总结】24届数字IC秋招给学弟学妹们的99条建议(标题党)

针对2023年找实习、秋招、谈薪资等方面的个人经验进行总结,希望对后续同学们找工作有所帮助

qq_42135020的博客 4462

POJ 1873 The Fortified Forest (计算几何,枚举+凸包)

看了很久了的题了,集训的时候就看过,每棵树有自己的价值和长度,现在要砍掉一些书做成栅栏,来围起剩余的树,并要使砍掉的树价值总和最小。 当时觉得有价值,树也有砍与不砍2种状态,就觉得这是DP,然后在死胡同里绕啊绕~~后来才发现,树2 要从数据量上推算法啊! //Memory: 216K //Time: 172MS #include #include #include #i

CSUST_ACM的专栏 902

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[POJ1873]The Fortified Forest(dfs+计算几何-凸包)

题目: 我是超链接 题意: 给出一些树(坐标,价值,长度),要求砍下一些树做成篱笆,将剩下的树围起来。求砍下的树最小价值的方案,如果有多种方案,输出砍的树的个数最少的。 题解: 嘛国王最多只有15棵树啊,dfs砍不砍的话2^15也不多,那就暴力一波,1A满意 代码: #include #include #include #include using namespace

薇小薇 315

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

POJ 1873 The Fortified Forest 暴力凸包

题意:给出n棵树的坐标,树的高度和树的价值,从这些树中砍掉一些(整棵整棵的)做围栏把剩余的树围起来,使得消耗的树的价值最小。输出应砍掉哪里些树以及剩余的材料的长度。(如果砍掉的价值相同,则取砍掉数目少的)(2 传说中的WF水题,卡了一晚上,结果发现是周长计算问题orz。。。说明我做题还是要小心点。。。 因为只有15棵树,用位运算枚举砍树情况就行了。 代码: /* * Author:

水果君の日常 2677

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

POJ 1873 The Fortified Forest

题意:是有n棵树,每棵的坐标,价值和长度已知,要砍掉若干根,用他们围住其他树,问损失价值最小的情况下又要长度足够围住其他树,砍掉哪些树。。              思路:先求要砍掉的哪些树,在求剩下的树求凸包,在判是否可行。(枚举+凸包)                 // Time 407ms; Memory 200K#include #include #include #inc

二十一画生的专栏 1246

POJ - 1873 The Fortified Forest (凸包 + 枚举)

The Fortified Forest Once upon a time, in a faraway land, there lived a king. This king owned a small collection of rare and valuable trees, which had been gathered by his ancestors on their trave...

YOONGI 427

POJ 1873 The Fortified Forest(凸包)题解

题意:二维平面有一堆点,每个点有价值v和删掉这个点能得到的长度l,问你删掉最少的价值能把剩余点围起来,价值一样求删掉的点最少 思路:n<=15,那么直接遍历2^15,判断每种情况。这里要优化一下,如果价值比当前最优大了continue。POJ的G++输出要用%f...orz,还是乖乖用C++... 代码: #include<set> #include<map&g...

weixin_34067980的博客 198

poj 1873 The Fortified Forest

题意:n棵树 xi, yi, vi, li   给出每棵树的位置( xi, yi ),价值 vi,  砍了这棵树能造多长 的围墙 li     n最大只有15,所以直接采用枚举 满足条件 砍了的树足够将剩下的数围起来(凸包),输出 剩下的树的价值和最大的方案。 存在多种方案时,输出,剩下的树最少的方案 Forest 1 Cut these trees: 砍了哪些树 E

observadores的博客 346

poj1873 The Fortified Forest (状压+凸包)

题意: 平面上有n棵树(2~15),现在要砍掉其中的一部分来做成篱笆将剩下的树包围起来,现在给出每棵树的坐标、价值和可以制造篱笆的长度,求砍掉最少价值的树,将剩下的树包围起来,当两种方式的价值相同时,取砍掉树更少的方式。输出砍掉的树和篱笆剩余多少。 思路 位运算枚举砍掉的树的L和保留的树的凸包周长。 代码 #include<cstdio> #include<iostream> #include<algorithm> #include<cmath>.

kth_xixi 199

POJ-1873 The Fortified Forest(凸包问题)

题目: Once upon a time, in a faraway land, there lived a king. This king owned a small collection of rare and valuable trees, which had been gathered by his ancestors on their travels. To protect his t...

slark_的博客 394

poj1873 The Fortified Forest【枚举+凸包】

题目链接:http://poj.org/problem?id=1873 题意:给你n棵树,让你从这n棵树中,看k棵树,把剩下的数围起来,砍每棵树的价值和每棵树的长度都告诉你,问你能否话最小的价值把剩下的书围起来,如果价值相同,则输出看的树最少的结果。最后需要输出的是,砍了哪几颗树,还剩下都少长度的木材 解析:由于n才15,于是可以考虑枚举砍的情况的所有子集,然后把剩下的树做凸包,然后不断更新答案

22h's Blog 447

World Final 1999 poj 1873 The Fortified Forest 状压枚举 凸包

题目地址:poj1873

Jingqi@Mr.B的ACM博客 965
上一篇: POJ 1228 Grandpa's Estate 计算凸包+判断点在线段上
下一篇: POJ 2007 Scrambled Polygon 极角排序
f_cpp
博客等级 码龄12年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值