题意:给出一些树的位置,价值,长度,现要求先砍一些树制成一定长度的篱笆将剩余的树围起来,求要砍树的最小总价值。

因为树的个数最多为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 枚举+凸包相关推荐

  1. POJ 1873 The Fortified Forest(枚举+凸包+剪枝)

    POJ 1873 The Fortified Forest 题意: 某王有一些树,要制作一个栅栏将所有树围起来,栅栏制作木材来源就是砍去其中一些树. 现在输入每棵树的坐标,价值,高度,求出所围价值最大 ...

  2. The Fortified Forest POJ - 1873

    The Fortified Forest POJ - 1873 题意:n棵树,砍掉一些树做木材将剩余的树围起来. n较小,二进制枚举~ 1 #include <cstdio> 2 #inc ...

  3. poj 1873 The Fortified Forest (位运算枚举 + 凸包周长)

    题目链接:http://poj.org/problem?id=1873 大意:有一片N棵树的森林,要从中砍掉几棵树做成篱笆,把剩下的树围起来 输入:给N课树,每棵树的坐标是x,y,每棵树有一个vi和l ...

  4. POJ 1873 The Fortified Forest (凸包,状态压缩枚举)

    题目链接:http://poj.org/problem?id=1873 题意:给出一些树,每棵树有坐标,高度,以及价值,要求砍掉一些树,用那些木材,将其它树围起来,要求花最小的代价,代价相同,要求砍掉 ...

  5. POJ 1873 The Fortified Forest 凸包 二进制枚举

    n最大15,二进制枚举不会超时.枚举不被砍掉的树,然后求凸包 #include<stdio.h> #include<math.h> #include<algorithm& ...

  6. POJ 1873 The Fortified Forest(凸包)

    http://poj.org/problem?id=1873 题目大意: 给你n棵树每棵树的坐标,高度,价值,要求砍掉一些树,用那些木材,将其它树围起来,要求花最小的代价,代价相同,要求砍掉最少的树. ...

  7. POJ 1873 The Fortified Forest(凸包)题解

    题意:二维平面有一堆点,每个点有价值v和删掉这个点能得到的长度l,问你删掉最少的价值能把剩余点围起来,价值一样求删掉的点最少 思路:n<=15,那么直接遍历2^15,判断每种情况.这里要优化一下 ...

  8. ●POJ 1873 The Fortified Forest

    题链: http://poj.org/problem?id=1873 题解: 计算几何,凸包 枚举被砍的树的集合.求出剩下点的凸包.然后判断即可. 代码: #include<cmath> ...

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

    题目链接:http://poj.org/problem?id=1873 题目大意:给出n棵树的位置(x,y)坐标,价值v和长度l.让你从中选择一些树,砍掉他们将其他的树围起来. 要求砍的这些树的价值之 ...

最新文章

  1. MATLAB 的运算符
  2. python自动化接口测试中的cookies怎么实现_python接口自动化测试--requests cookies处理...
  3. Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载)
  4. iOS定位服务与地图开发(3)---地理信息编码查询
  5. csdn学院 python_确认!别再相信Python了! 程序员:就你敢说...
  6. 101-字符串类string基础使用
  7. 315曝光:老坛酸菜工人穿拖鞋、光脚踩 防腐剂超标10倍!多家电商平台下架老坛酸菜...
  8. Android让文本输入框默认不获取焦点
  9. 85.一致性哈希算法:hash模块
  10. Hive insert into小文件问题优化解决
  11. 对于提高团队开会效率的看法
  12. String对象intern方法
  13. k8s运维-06-kubectl delete node的过程
  14. 基频,倍频,基波,谐波,基音,泛音
  15. seo php,SEO技术:PHP页面的SEO优化
  16. python 拆分excel工作表_Python几行代码轻松拆分表格
  17. defender 月考总结
  18. 关于星巴克推广活动的实验测试
  19. 那些年我们一起追过的美剧
  20. Matlab编程之混沌系统李雅普诺夫指数分析

热门文章

  1. mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)
  2. 考c语言三级需要什么软件,全国计算机三级网络技术上机考C语言的软件是什么哈?...
  3. 计算机硬件拆解,计算机硬件系统及主机拆解.ppt
  4. 多目标优化蚁群算法的matlab_深入浅出多目标优化10分钟多目标优化入门
  5. java基本数据类型_老杜带你学Java【第六课】
  6. ladp3 获取属性_Ldap获取ad属性的方法.
  7. 判读一个对象不为空_LabVIEW面向对象编程_初窥门径(3):开发实践
  8. camera客观测试_光学图像测试之屏幕色彩管理测试
  9. Java多线程闲聊(四):阻塞队列与线程池原理
  10. 从零学习 vim 一个多月, 感觉最有用的三个教程