题意:是有n棵树,每棵的坐标,价值和长度已知,要砍掉若干根,用他们围住其他树,问损失价值最小的情况下又要长度足够围住其他树,砍掉哪些树。。

思路:先求要砍掉的哪些树,在求剩下的树求凸包,在判是否可行。(枚举+凸包)

// Time 407ms; Memory 200K
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define inf 200000
using namespace std; bool vis[15],tvis[15];
int n,m,minv,tn; typedef struct point
{
double x,y;
int v;
double l;
int z;
point(double xx=0,double yy=0,int vv=0,double ll=0,int zz=0):x(xx),y(yy),v(vv),l(ll),z(zz){}
}vector; point p[15],ch[15]; bool operator < (point a,point b)
{
return a.x<b.x || (a.x==b.x && a.y<b.y);
}
vector operator - (point a,point b)
{
return vector(a.x-b.x,a.y-b.y);
}
double cross(vector a,vector b)
{
return a.x*b.y-a.y*b.x;
}
double len(vector a)
{
return sqrt(a.x*a.x+a.y*a.y);
} int graph()
{
int k,i;
m=0;
for(i=0;i<n;i++) if(!vis[i])
{
while(m>1 && cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
ch[m++]=p[i];
}
k=m;
for(i=n-2;i>=0;i--) if(!vis[i])
{
while(m>k && cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
ch[m++]=p[i];
}
if(n>1) m--;
double s1=0,s2=0;
for(i=0;i<m;i++) s1+=len(ch[i]-ch[(i+1)%m]);
for(i=0;i<n;i++) if(vis[i]) s2+=p[i].l;
return s1<=s2;
}
void dfs(int d)
{
int i,mv=0,mn=0;
if(d==n)
{
if(graph())
{
for(i=0;i<n;i++) if(vis[i])
{
mv+=p[i].v;mn++;
}
if(mv<minv || (mv==minv && tn>mn))
{
for(i=0;i<n;i++) tvis[i]=vis[i];
minv=mv;
tn=mn;
}
}
return;
}
dfs(d+1);
vis[d]=1;
dfs(d+1);
vis[d]=0;
}
int main()
{
int i,j,t=0,a[15];
while(scanf("%d",&n)!=EOF && n)
{
for(i=0;i<n;i++)
{
scanf("%lf%lf%d%lf",&p[i].x,&p[i].y,&p[i].v,&p[i].l);
p[i].z=i;
} sort(p,p+n);
minv=inf;tn=inf;
memset(vis,0,sizeof(vis)); dfs(0);
if(t++) printf("\n");
printf("Forest %d\n",t);
printf("Cut these trees:");
j=0;
for(i=0;i<n;i++) if(tvis[i]) a[j++]=p[i].z+1;
sort(a,a+j);
for(i=0;i<j;i++) printf(" %d",a[i]); double s1=0,s2=0;
for(i=0;i<n;i++) vis[i]=tvis[i];
graph();
for(i=0;i<m;i++) s1+=len(ch[i]-ch[(i+1)%m]);
for(i=0;i<n;i++) if(vis[i]) s2+=p[i].l;
printf("\nExtra wood: %.2lf\n",s2-s1);
}
return 0;
}

POJ 1873 The Fortified Forest的更多相关文章

  1. POJ 1873 The Fortified Forest [凸包 枚举]

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6400   Accepted: 1 ...

  2. ●POJ 1873 The Fortified Forest

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

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

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

  4. POJ 1873 - The Fortified Forest 凸包 + 搜索 模板

    通过这道题发现了原来写凸包的一些不注意之处和一些错误..有些错误很要命.. 这题 N = 15 1 << 15 = 32768 直接枚举完全可行 卡在异常情况判断上很久,只有 顶点数 &g ...

  5. 简单几何(凸包+枚举) POJ 1873 The Fortified Forest

    题目传送门 题意:砍掉一些树,用它们做成篱笆把剩余的树围起来,问最小价值 分析:数据量不大,考虑状态压缩暴力枚举,求凸包以及计算凸包长度.虽说是水题,毕竟是final,自己状压的最大情况写错了,而且忘 ...

  6. POJ 1873 The Fortified Forest(枚举+凸包)

    Description Once upon a time, in a faraway land, there lived a king. This king owned a small collect ...

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

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

  8. poj 1873 凸包+枚举

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6198   Accepted: 1 ...

  9. Uva5211/POJ1873 The Fortified Forest 凸包

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

随机推荐

  1. C# WinForm开发系列 - WebBrowser

    原文:C# WinForm开发系列 - WebBrowser 介绍Vs 2005中带的WebBrowser控件使用以及一些疑难问题的解决方法, 如如何正确显示中文, 屏蔽右键菜单, 设置代理等; 收集 ...

  2. Highcharts图表导出为pdf的JavaWeb实践

    写给读者的话^_^: 众所周知,基于Highcharts插件生成的svg图片组(注意这里鄙人指的组是若干图有序组合,并非一张图片,具有业务意义)导出为PDF文档是有难度滴.鄙人也曾“异想天开”用前端技 ...

  3. 【Java&amp;Android开源库代码分析】のandroid-async-http の开盘

          在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...

  4. mysql设置root的密码

    mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

  5. js 指定位置插入html标签(可编辑div)

    demo效果如下: html代码部分如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  6. 添加MySql Metat Database 信息

    有时候我们想看看 一个数据库上面 某种元素(比如表名)的所有信息,在Mysql上 我们可以通过引入information_schema 的方式,就可以非常方便的查看到. 添加步骤 Edit->P ...

  7. SQL远程恢复

    原文:SQL远程恢复 -- ============================================= -- Author: dcrenl -- Create date: 2013-9 ...

  8. 什么是Solr搜索

    什么是Solr搜索 一.Solr综述   什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...

  9. QTP中DataTable操作大全

    序曲 假设现在有一个Excel文件:D:\data.xls,里面的具体内容如下:有两个Sheet,第一个叫Login,第二个叫InsertOrder: 当前QTP的Test中有两个Action:Log ...

  10. 动态注册HttpModule

    动态注册HttpModule 2014-06-05 08:58 by 汤姆大叔, 757 阅读, 4 评论, 收藏, 编辑 文章内容 通过前面的章节,我们知道HttpApplication在初始化的时 ...