简单凸包+暴力枚举。
/*
几何凸包+暴力
*/
#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【凸包】"所指的是一道来自北京大学在线判题系统POJ的编程题目。该题目主要涉及计算机科学中的算法问题,特别是几何算法中的“凸包”概念。 【描述】"北大POJ1113-Wall【凸包】解题报告+AC...
总之,解决“poj2187 凸包问题”需要掌握计算几何的基本概念,特别是凸包算法,并能够灵活运用这些算法来处理给定的点集,同时具备良好的编程能力和问题解决技巧,以满足O(nlogn)的时间复杂度要求。
【北大POJ初级-计算几何学】是北京大学编程在线判题平台(Problem Online Judge, POJ)上的一系列初级算法题目,主要涉及计算几何领域的知识。这个领域在计算机科学中占有重要地位,因为它在图形处理、游戏开发、...
在计算机科学领域,凸包(Convex Hull)是一种重要的几何概念,它在各种算法和问题中都有着广泛的应用,比如机器学习、图形学、路径规划等。这篇博客“学习凸包(三): 凸包练习 POJ 1113”显然是关于如何通过编程...
【标题】"凸包练习: POJ 2187(JAVA)" 是一个关于编程算法的挑战,主要涉及计算机科学中的几何算法。在本问题中,我们关注的是二维平面上的点集及其凸包(Convex Hull)的概念。凸包可以被理解为一个最小的多边形,该...
* 计算几何学:计算几何学是指解决问题的计算几何学算法,如 poj2031、poj1039。 六、数学 数学是指解决问题的数学算法,包括组合数学、数论、计算方法等。 * 组合数学:组合数学是指解决问题的组合数学算法,...
poj题目分类 POJ(Princeton Online Judge)是一個在线编程平台...4. 凸包:例如 poj2187、poj1113。 这些知识点涵盖了算法、数据结构、数学、计算几何学等领域的多个方面,为编程爱好者和学生提供了广泛的知识基础。
- POJ 2635、POJ 3292:几何计算及形状问题。 - POJ 1845、POJ 2115:几何图形属性分析。 #### 计算几何 - **题目示例**: - POJ 3273、POJ 3258:几何对象之间的关系。 - POJ 1905、POJ 3122:复杂的几何计算...
* 凸包:poj2187, poj1113 中级部分: 一、基本算法 * C++的标准模版库的应用 + poj3096, poj3007 * 较为复杂的模拟题的训练 + poj3393, poj1472, poj3371, poj1027, poj2706 二、图算法 * 差分约束系统的...
- **凸包**:找到包含所有点的最小凸多边形,如poj2187。 这些知识点是ACM竞赛中常见的主题,掌握了这些,可以有效提升解决算法问题的能力。对于初级选手,可以从基础算法开始,逐步挑战更复杂的图算法和数据结构...
然而,在某些数据集上,如 POJ2187 题目,凸包顶点数较少时,两者差异可能不明显。 总之,凸包模版旋转卡壳算法是一种高效的计算二维点集凸包直径的方法。它通过巧妙地利用了凸包性质和叉积来优化搜索过程,实现了...
标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...
几何算法涉及点、线、面的性质和关系,如凸包、最近点对、三角剖分等问题。这些算法在计算机图形学、地理信息系统等领域有着广泛的应用。例如,题目poj3273和poj3258就涉及到几何知识。 ### 8. 编程技巧 编程技巧...
本题来自于POJ(Pacific Ocean Judge)平台的一个练习题,主要目的是实现一种有效的凸包算法。代码本身已经完成,下面我们将对其进行全面解析,以便更好地理解其工作原理。 #### 三、代码详解 ##### 1. 基础数据...
1. **凸包**:构建点集的凸包(poj3267, poj1836, poj1260, poj2533)。 2. **线段交**:计算线段是否相交及交点位置(poj3176, poj1080, poj1159)。 ### 七、概率统计 1. **概率计算**:计算随机事件的概率(POJ...
### POJ 分类题目知识点详解 #### 一、基本算法 **1. 枚举** - **定义**:枚举是一种通过尝试所有可能情况来解决问题的方法。 - **示例题目**: - poj1753 - poj2965 - **应用场景**:适用于问题规模较小或解决...
- 几何问题中的特殊技巧,如旋转卡壳算法求凸包等。 #### 7. 模拟题 模拟题要求按照题目给出的规则进行模拟操作。 - **知识点**: - 逻辑清晰的程序设计能力。 - 仔细阅读题目的条件和要求。 - 合理地安排代码...
- **poj1113**:同样涉及到凸包的概念,可能需要用到Jarvis步进法。 ##### (5) 面积交、面积并 - **面积交**:计算两个或多个多边形相交区域的面积。 - **面积并**:计算两个或多个多边形覆盖区域的总面积。 - 这...
计算几何学部分涵盖了几何公式、叉积和点积的运用、多边型的简单算法和凸包四个方面。例如,POJ2031和POJ1039是几何公式的经典例题,而POJ1408和POJ1584则是多边型的简单算法的代表题。 中级部分涵盖了基本算法、图...
- 凸包:找出一组点的最小凸包,如POJ2187。 这些知识点构成了ACM竞赛的基础,对于参赛者来说,理解和熟练掌握这些算法和数据结构是取得好成绩的关键。通过练习和不断挑战,选手们的编程思维和问题解决能力会得到...