The Fortified Forest

POJ - 1873

题意:n棵树,砍掉一些树做木材将剩余的树围起来。

n较小,二进制枚举~

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 const double eps=1e-12;
 8 const int inf=0x3f3f3f3f;
 9 const int maxn=16;
10 struct Node{
11     int x,y,vi,li;
12     bool operator < (const Node& a)const{
13         return x<a.x||x==a.x&&y<a.y;
14     }
15     Node operator - (const Node& a){
16         return Node{x-a.x,y-a.y};
17     }
18 }p[maxn],vex[maxn],ch[maxn];
19 double getdis(Node a,Node b){
20     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
21 }
22 int cut[maxn],ans[maxn];
23
24 int cross(Node a,Node b){
25     return a.x*b.y-a.y*b.x;
26 }
27
28 double ConvexHull(Node *p,int n){
29     if(n<=1) return 0;
30     sort(p,p+n);
31     int m=0;
32     for(int i=0;i<n;i++){
33         while(m>1&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
34         ch[m++]=p[i];
35     }
36     int k=m;
37     for(int i=n-2;i>=0;i--){
38         while(m>k&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
39         ch[m++]=p[i];
40     }
41     m--;
42     double ans=getdis(ch[0],ch[m]);
43     for(int i=0;i<m;i++) ans+=getdis(ch[i],ch[i+1]);
44     return ans;
45 }
46 int main(){
47     int n,kase=0;
48     while(scanf("%d",&n)&&n){
49         if(kase) puts("");
50         for(int i=0;i<n;i++) scanf("%d%d%d%d",&p[i].x,&p[i].y,&p[i].vi,&p[i].li);
51         int sta=1<<n;
52         int minval=inf,id;
53         double res;
54         int tempval,templen;
55         for(int i=1;i<sta;i++){
56             int cnt=0,num=0;
57             tempval=0;templen=0;
58             for(int j=0;j<n;j++) if((1<<j)&i){
59                 cut[cnt++]=j;
60                 tempval+=p[j].vi;
61                 templen+=p[j].li;
62             }else {
63                 vex[num++]=p[j];
64             }
65             double dis=ConvexHull(vex,num);
66             if(templen>dis&&(tempval<minval||tempval==minval&&cnt<id)){
67                 minval=tempval;
68                 res=templen-dis;
69                 id=cnt;
70                 for(int i=0;i<cnt;i++) ans[i]=cut[i];
71             }
72         }
73         printf("Forest %d\n",++kase);
74         printf("Cut these trees:");
75         for(int i=0;i<id;i++) printf(" %d",ans[i]+1);
76         printf("\nExtra wood: %.2f\n",res);
77     }
78     return 0;
79 }

View Code

转载于:https://www.cnblogs.com/yijiull/p/7375970.html

The Fortified Forest POJ - 1873相关推荐

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

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

  2. 【poj】1873: The Fortified Forest (凸包+状态压缩+各种搞事)

    题目描述: The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7818   Accep ...

  3. Uva5211/POJ1873 The Fortified Forest 凸包

    LINK 题意:给出点集,每个点有个价值v和长度l,问把其中几个点取掉,用这几个点的长度能把剩下的点围住,要求剩下的点价值和最大,拿掉的点最少且剩余长度最长. 思路:1999WF中的水题.考虑到其点的 ...

  4. The Fortified Forest UVALive - 5211 [二进制枚举+凸包周长]

    The Fortified Forest UVALive - 5211 题意:n棵树,每棵树对应有x,y,v,l分别代表横坐标,纵坐标,价值,砍这棵树能构成的篱笆长度.现在要求输出,在最小被砍价值的情 ...

  5. uva 811 - The Fortified Forest(暴力+凸包)

    题目链接:uva 811 - The Fortified Forest 最多就15棵树,枚举哪些树要砍,剩下的做凸包. #include <cstdio> #include <cst ...

  6. ●POJ 1873 The Fortified Forest

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

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

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

  8. POJ 1873 The Fortified Forest(凸包)

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

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

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

最新文章

  1. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
  2. 常用Linux路由命令(route、ip、ifconfig等等)
  3. 讲真,下次打死我也不敢随便改serialVersionUID了
  4. python import from class_Python: import vs from (module) import function(class) 的理解
  5. 解决properties文件乱码问题(eclipse和MyEclipse)
  6. 网页浏览器知道我们的哪些信息?(1)
  7. 闭包---在函数内部再定义一个函数
  8. 步进电机为什么无法高速启动?
  9. XP---VS05---部署个人网站初学者工具包---方案
  10. 深入研究:HTTP2的真正性能到底如何
  11. Linux基础四---系统监控硬盘分区
  12. 华为数通 软开 2022校招 面试全过 已开奖
  13. 记一个用PyPDF2裁剪pdf文件并用latex插入后出现大量空白的问题
  14. 建立一个被称为sroot()的函数,返回其参数的二次方根,重载sroot()三次,让它返回整数,长整数与双精度的二次方根
  15. Android 在导航栏上添加一个截屏按键,点击进行截屏
  16. java 格式化时分秒_java整数(秒数)转换为时分秒格式的示例
  17. 微软翻译与服务器断开,一水的机翻?微软中文翻译也闹笑话了
  18. Linux判断服务进程存在,存在则重启,不存在则启动
  19. 新西兰android时区代码,Android北京时间转换为新西兰时间
  20. 爬取全国大学校徽合集批量制作队牌

热门文章

  1. get和post的区别(传参方式)
  2. php集成封装monolog日志类
  3. Monolog php日志
  4. PostgreSQL copy 命令教程
  5. EPOLLOUT分析
  6. vs2015或vs2017报错未能安装包“Microsoft.VisualCpp.Redist.14,version=14.16.27012.2,chip=x86 错误代码55的解决办法!
  7. 《万历十五年》的感想
  8. 微信小程序动画(四):平移
  9. [架构之路-105]:《软件架构设计:程序员向架构师转型必备》-15-模块划分的综合技术与4步骤法
  10. 将来不会倒闭的8种行业,你上车了吗?