poj 1873 枚举+凸包
题意:给出一些树的位置,价值,长度,现要求先砍一些树制成一定长度的篱笆将剩余的树围起来,求要砍树的最小总价值。
因为树的个数最多为15个很容易想到用二进制数表示树的状态进行遍历。
#include<iostream>#include<cstdio>#include<cmath>using namespace std;#define MAX_INT 123456789#define esp 10e-8struct point {int x,y;};point vertex[16];int res[16],Choice[16],noChoice[16],minLeft[16];double length[16],wight[16];int cmp(const void * a,const void * b){ point p1,p2; p1=vertex[*(int*)a]; p2=vertex[*(int *)b];if(p1.x==p2.x)return p1.y-p2.y;return p1.x-p2.x;}int cross(point p0,point p1,point p2){return (p2.y-p0.y)*(p1.x-p0.x)-(p1.y-p0.y)*(p2.x-p0.x);}int dist(point p1,point p2){return (p1.y-p2.y)*(p1.y-p2.y)+(p1.x-p2.x)*(p1.x-p2.x);}int cmp1(const void* a,const void * b){return *(int *)a-*(int *)b;}int graham(int n,int m){int i,len,top=1;if(n<2) return 0; qsort(Choice,n,sizeof(Choice[0]),cmp); res[0]=Choice[0]; res[1]=Choice[1]; for(i=2;i<n;i++) {while(top && cross(vertex[res[top-1]],vertex[res[top]],vertex[Choice[i]])<=0) top--; res[++top]=Choice[i]; } len=top; res[++top]=Choice[n-2];for(i=n-3;i>=0;i--) {while(top!=len && cross(vertex[res[top-1]],vertex[res[top]],vertex[Choice[i]])<=0) top--; res[++top]=Choice[i]; }return top;}int print(int count,int len,double leaves){int i; qsort(minLeft,len,sizeof(int),cmp1); printf("Forest %d\n",count); printf("Cut these trees:");for(i=0;i<len;i++) printf(" %d",minLeft[i]+1); printf("\n"); printf("Extra wood: %.2lf\n\n",leaves);return 0;}int main(){int i,j,k,n,len,len1,len2,top,count=0;double cutLen,noCutLen,leaves,value, cur_min;while(scanf("%d",&n) && n) { count++;for(i=0;i<n;i++) scanf("%d%d%lf%lf",&vertex[i].x,&vertex[i].y,&wight[i],&length[i]); k=(1<<n); cur_min=MAX_INT; len=0;for(i=k-1;i>=0;i--) { len1=len2=0; memset(Choice,0,sizeof(Choice));//选择要砍的树和不砍的树 for(j=0;j<n;j++) {if(i&(1<<j)) Choice[len1++]=j;else noChoice[len2++]=j; } cutLen=noCutLen=value=0;//砍的树的总长度和总价值 for(j=0;j<len2;j++) { cutLen+=length[noChoice[j]]; value+=wight[noChoice[j]]; }//计算凸包和周长 top=graham(len1,len2); for(j=0;j<top;j++) { noCutLen+=sqrt((double)dist(vertex[res[j]],vertex[res[j+1]])); }//寻找在砍的树的总长度大于凸包周长的情况下的最小价值 if(cutLen>=noCutLen) {if(value<cur_min || (abs(value-cur_min)<=esp && len2<len)) { cur_min=value; len=len2; leaves=cutLen-noCutLen; for(j=0;j<len2;j++) { minLeft[j]=noChoice[j]; } } } } print(count,len,leaves); }return 0;}
转载于:https://www.cnblogs.com/yu-chao/archive/2011/11/13/2247469.html
poj 1873 枚举+凸包相关推荐
- POJ 1873 The Fortified Forest(枚举+凸包+剪枝)
POJ 1873 The Fortified Forest 题意: 某王有一些树,要制作一个栅栏将所有树围起来,栅栏制作木材来源就是砍去其中一些树. 现在输入每棵树的坐标,价值,高度,求出所围价值最大 ...
- The Fortified Forest POJ - 1873
The Fortified Forest POJ - 1873 题意:n棵树,砍掉一些树做木材将剩余的树围起来. n较小,二进制枚举~ 1 #include <cstdio> 2 #inc ...
- poj 1873 The Fortified Forest (位运算枚举 + 凸包周长)
题目链接:http://poj.org/problem?id=1873 大意:有一片N棵树的森林,要从中砍掉几棵树做成篱笆,把剩下的树围起来 输入:给N课树,每棵树的坐标是x,y,每棵树有一个vi和l ...
- POJ 1873 The Fortified Forest (凸包,状态压缩枚举)
题目链接:http://poj.org/problem?id=1873 题意:给出一些树,每棵树有坐标,高度,以及价值,要求砍掉一些树,用那些木材,将其它树围起来,要求花最小的代价,代价相同,要求砍掉 ...
- POJ 1873 The Fortified Forest 凸包 二进制枚举
n最大15,二进制枚举不会超时.枚举不被砍掉的树,然后求凸包 #include<stdio.h> #include<math.h> #include<algorithm& ...
- POJ 1873 The Fortified Forest(凸包)
http://poj.org/problem?id=1873 题目大意: 给你n棵树每棵树的坐标,高度,价值,要求砍掉一些树,用那些木材,将其它树围起来,要求花最小的代价,代价相同,要求砍掉最少的树. ...
- POJ 1873 The Fortified Forest(凸包)题解
题意:二维平面有一堆点,每个点有价值v和删掉这个点能得到的长度l,问你删掉最少的价值能把剩余点围起来,价值一样求删掉的点最少 思路:n<=15,那么直接遍历2^15,判断每种情况.这里要优化一下 ...
- ●POJ 1873 The Fortified Forest
题链: http://poj.org/problem?id=1873 题解: 计算几何,凸包 枚举被砍的树的集合.求出剩下点的凸包.然后判断即可. 代码: #include<cmath> ...
- POJ-1873-The Fortified Forest(二进制枚举+凸包)
题目链接:http://poj.org/problem?id=1873 题目大意:给出n棵树的位置(x,y)坐标,价值v和长度l.让你从中选择一些树,砍掉他们将其他的树围起来. 要求砍的这些树的价值之 ...
最新文章
- MATLAB 的运算符
- python自动化接口测试中的cookies怎么实现_python接口自动化测试--requests cookies处理...
- Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载)
- iOS定位服务与地图开发(3)---地理信息编码查询
- csdn学院 python_确认!别再相信Python了! 程序员:就你敢说...
- 101-字符串类string基础使用
- 315曝光:老坛酸菜工人穿拖鞋、光脚踩 防腐剂超标10倍!多家电商平台下架老坛酸菜...
- Android让文本输入框默认不获取焦点
- 85.一致性哈希算法:hash模块
- Hive insert into小文件问题优化解决
- 对于提高团队开会效率的看法
- String对象intern方法
- k8s运维-06-kubectl delete node的过程
- 基频,倍频,基波,谐波,基音,泛音
- seo php,SEO技术:PHP页面的SEO优化
- python 拆分excel工作表_Python几行代码轻松拆分表格
- defender 月考总结
- 关于星巴克推广活动的实验测试
- 那些年我们一起追过的美剧
- Matlab编程之混沌系统李雅普诺夫指数分析
热门文章
- mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)
- 考c语言三级需要什么软件,全国计算机三级网络技术上机考C语言的软件是什么哈?...
- 计算机硬件拆解,计算机硬件系统及主机拆解.ppt
- 多目标优化蚁群算法的matlab_深入浅出多目标优化10分钟多目标优化入门
- java基本数据类型_老杜带你学Java【第六课】
- ladp3 获取属性_Ldap获取ad属性的方法.
- 判读一个对象不为空_LabVIEW面向对象编程_初窥门径(3):开发实践
- camera客观测试_光学图像测试之屏幕色彩管理测试
- Java多线程闲聊(四):阻塞队列与线程池原理
- 从零学习 vim 一个多月, 感觉最有用的三个教程