`
xxx0624
  • 浏览: 30817 次
文章分类
社区版块
存档分类
最新评论

POJ1873+几何凸包

 
阅读更多

简单凸包+暴力枚举。

/*
几何凸包+暴力
*/
#include<algorithm>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b)) 
const int inf = 0x3f3f3f3f;
const double pi=acos(-1.0);
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
const double eps = 1e-8;
const int maxm = 1005;
const int maxn = 16;

struct Point2 {
	int x,y;
	double val,len;
	bool ok;//ok = true 需要去掉的点
}pnt[ maxn ];
int cur[ maxn ];
int cnt_cur;
double val_cur,ans1;
int best[ maxn ];
int cnt_best;
double val_best,ans2;
double Len1,Len2;
struct Point {
	double x,y;
	bool operator < ( const Point &t ) const {
		return y<t.y||( y==t.y&&x<t.x );
	}
}a[ maxn ],res[ maxn ];

double xmult( Point sp,Point ep,Point op ){
	return (sp.x-op.x)*(ep.y-op.y)-(sp.y-op.y)*(ep.x-op.x);
}

double dist( int i,int j ){
	return sqrt( (res[i].x-res[j].x)*(res[i].x-res[j].x)+(res[i].y-res[j].y)*(res[i].y-res[j].y) );
}

int Graham( int n ){
	int top = 1;
	sort( a,a+n );
	if( n==0 ) return 0;
	else res[0] = a[0];
	if( n==1 ) return 1;
	else res[1] = a[1];
	if( n==2 ) return 2;
	else res[2] = a[2];
	for( int i=2;i<n;i++ ){
		while( top>0 && xmult(res[top],res[top-1],a[i])>=0 )
			top--;
		res[ ++top ] = a[i];
	}
	int len = top;
	res[ ++top ] = a[ n-2 ];
	for( int i=n-3;i>=0;i-- ){
		while( top!=len && xmult( res[top],res[top-1],a[i])>=0 )
			top--;
		res[ ++top ] = a[i];
	}
	return top;
} 

bool Solve( int n ){
	double temp1 = 0;
	int cc = 0;
	for( int i=0;i<n;i++ ){
		  if( pnt[i].ok==false ){
		  	a[ cc ].x = 1.0*pnt[ i ].x;
		  	a[ cc ].y = 1.0*pnt[ i ].y;
		  	cc++;
		  }
		  else temp1 += pnt[ i ].len;
	}
	int q = cc;
	cc = Graham( q );
	double temp2 = 0;
	res[ cc ] = res[ 0 ];
	for( int i=0;i<cc;i++ ){
		temp2 += dist( i,i+1 );
	}
	ans1 = temp2;
	Len1 = temp1;
	if( temp2<=temp1 ) return true;
	else return false;
}
	
int main(){
	int n;
	int Case = 1;
	while( scanf("%d",&n),n ){
		if( Case!=1 ) printf("\n");
		for( int i=0;i<n;i++ ){
			scanf("%d%d%lf%lf",&pnt[i].x,&pnt[i].y,&pnt[i].val,&pnt[i].len);
		}
		int N = (1<<n);
		ans1 = ans2 = 0;
		val_best = 9999999999.0;
		for( int i=0;i<N;i++ ){
			cnt_cur = 0;
			val_cur = 0;
			for( int j=0;j<n;j++ ){
				if( i&(1<<j) ){
					cur[ cnt_cur++ ] = j;
					pnt[ j ].ok = true;
					val_cur += pnt[ j ].val;
				}
				else
					pnt[ j ].ok = false;
			}
			if( cnt_cur==n ) continue;
			if( Solve(n)==true ){
				//printf("Solve\n");
				 if( val_cur<val_best ){
				 	val_best = val_cur;
				 	for( int k=0;k<cnt_cur;k++ ){
				 		best[ k ] = cur[ k ];
				 	}
				 	cnt_best = cnt_cur;
				 	ans2 = ans1;
				 	Len2 = Len1;
				 }
				 else if( val_cur==val_best ){
				 	if( cnt_cur<cnt_best ){
				 		for( int k=0;k<cnt_cur;k++ ){
				 			best[ k ] = cur[ k ];
				 		}
				 		cnt_best = cnt_cur;
				 		ans2 = ans1;
				 		Len2 = Len1;
				 	}
				 }
			}
		}
		printf("Forest %d\n",Case++);
		printf("Cut these trees: ");
		for( int i=0;i<cnt_best;i++ )
			printf("%d ",best[i]+1);
		printf("\n");
		printf("Extra wood: %.2lf\n",Len2-ans2);
	}
	return 0;
}


分享到:
评论

相关推荐

    POJ1113-Wall【凸包】

    【标题】"POJ1113-Wall【凸包】"所指的是一道来自北京大学在线判题系统POJ的编程题目。该题目主要涉及计算机科学中的算法问题,特别是几何算法中的“凸包”概念。 【描述】"北大POJ1113-Wall【凸包】解题报告+AC...

    pku_poj_2187.rar_poj 2187_凸包问题

    总之,解决“poj2187 凸包问题”需要掌握计算几何的基本概念,特别是凸包算法,并能够灵活运用这些算法来处理给定的点集,同时具备良好的编程能力和问题解决技巧,以满足O(nlogn)的时间复杂度要求。

    北大POJ初级-计算几何学

    【北大POJ初级-计算几何学】是北京大学编程在线判题平台(Problem Online Judge, POJ)上的一系列初级算法题目,主要涉及计算几何领域的知识。这个领域在计算机科学中占有重要地位,因为它在图形处理、游戏开发、...

    学习凸包(三):凸包练习 POJ 1113

    在计算机科学领域,凸包(Convex Hull)是一种重要的几何概念,它在各种算法和问题中都有着广泛的应用,比如机器学习、图形学、路径规划等。这篇博客“学习凸包(三): 凸包练习 POJ 1113”显然是关于如何通过编程...

    凸包练习: POJ 2187(JAVA)

    【标题】"凸包练习: POJ 2187(JAVA)" 是一个关于编程算法的挑战,主要涉及计算机科学中的几何算法。在本问题中,我们关注的是二维平面上的点集及其凸包(Convex Hull)的概念。凸包可以被理解为一个最小的多边形,该...

    POJ算法题目分类

    * 计算几何学:计算几何学是指解决问题的计算几何学算法,如 poj2031、poj1039。 六、数学 数学是指解决问题的数学算法,包括组合数学、数论、计算方法等。 * 组合数学:组合数学是指解决问题的组合数学算法,...

    poj题目分类

    poj题目分类 POJ(Princeton Online Judge)是一個在线编程平台...4. 凸包:例如 poj2187、poj1113。 这些知识点涵盖了算法、数据结构、数学、计算几何学等领域的多个方面,为编程爱好者和学生提供了广泛的知识基础。

    经典 的POJ 分类

    - POJ 2635、POJ 3292:几何计算及形状问题。 - POJ 1845、POJ 2115:几何图形属性分析。 #### 计算几何 - **题目示例**: - POJ 3273、POJ 3258:几何对象之间的关系。 - POJ 1905、POJ 3122:复杂的几何计算...

    ACM常用算法及其相应的练习题.docx

    * 凸包:poj2187, poj1113 中级部分: 一、基本算法 * C++的标准模版库的应用 + poj3096, poj3007 * 较为复杂的模拟题的训练 + poj3393, poj1472, poj3371, poj1027, poj2706 二、图算法 * 差分约束系统的...

    POJ题目简单分类(ACM)

    - **凸包**:找到包含所有点的最小凸多边形,如poj2187。 这些知识点是ACM竞赛中常见的主题,掌握了这些,可以有效提升解决算法问题的能力。对于初级选手,可以从基础算法开始,逐步挑战更复杂的图算法和数据结构...

    凸包模版旋转卡壳

    然而,在某些数据集上,如 POJ2187 题目,凸包顶点数较少时,两者差异可能不明显。 总之,凸包模版旋转卡壳算法是一种高效的计算二维点集凸包直径的方法。它通过巧妙地利用了凸包性质和叉积来优化搜索过程,实现了...

    poj各种分类

    标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...

    POJ 分类题目 txt文件

    几何算法涉及点、线、面的性质和关系,如凸包、最近点对、三角剖分等问题。这些算法在计算机图形学、地理信息系统等领域有着广泛的应用。例如,题目poj3273和poj3258就涉及到几何知识。 ### 8. 编程技巧 编程技巧...

    凸包做题模板

    本题来自于POJ(Pacific Ocean Judge)平台的一个练习题,主要目的是实现一种有效的凸包算法。代码本身已经完成,下面我们将对其进行全面解析,以便更好地理解其工作原理。 #### 三、代码详解 ##### 1. 基础数据...

    ACM-POJ 算法训练指南

    1. **凸包**:构建点集的凸包(poj3267, poj1836, poj1260, poj2533)。 2. **线段交**:计算线段是否相交及交点位置(poj3176, poj1080, poj1159)。 ### 七、概率统计 1. **概率计算**:计算随机事件的概率(POJ...

    POJ 分类题目

    ### POJ 分类题目知识点详解 #### 一、基本算法 **1. 枚举** - **定义**:枚举是一种通过尝试所有可能情况来解决问题的方法。 - **示例题目**: - poj1753 - poj2965 - **应用场景**:适用于问题规模较小或解决...

    poj(百练)题目分类

    - 几何问题中的特殊技巧,如旋转卡壳算法求凸包等。 #### 7. 模拟题 模拟题要求按照题目给出的规则进行模拟操作。 - **知识点**: - 逻辑清晰的程序设计能力。 - 仔细阅读题目的条件和要求。 - 合理地安排代码...

    acm计算几何与数论

    - **poj1113**:同样涉及到凸包的概念,可能需要用到Jarvis步进法。 ##### (5) 面积交、面积并 - **面积交**:计算两个或多个多边形相交区域的面积。 - **面积并**:计算两个或多个多边形覆盖区域的总面积。 - 这...

    ACM 详解算法目录

    计算几何学部分涵盖了几何公式、叉积和点积的运用、多边型的简单算法和凸包四个方面。例如,POJ2031和POJ1039是几何公式的经典例题,而POJ1408和POJ1584则是多边型的简单算法的代表题。 中级部分涵盖了基本算法、图...

    acm 分类 北大

    - 凸包:找出一组点的最小凸包,如POJ2187。 这些知识点构成了ACM竞赛的基础,对于参赛者来说,理解和熟练掌握这些算法和数据结构是取得好成绩的关键。通过练习和不断挑战,选手们的编程思维和问题解决能力会得到...

Global site tag (gtag.js) - Google Analytics