/*
poj1873 The Fortified Forest 凸包+枚举 水题
用小树林的木头给小树林围一个围墙
每棵树都有价值
求消耗价值最低的做法,输出被砍伐的树的编号和剩余的木料
若砍伐价值相同,则取砍伐数小的方案。
*/
#include<stdio.h>
#include<math.h>
#include <algorithm>
#include <vector>
using namespace std;
const double eps = 1e-8;
struct point
{
double x,y;
};
struct exinfo
{
int v,l;
}info[20];
int n;
point dian[20],zhan[20];
//////////////////////////////////////////////////
point *mo_dian;
double mo_distance(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double mo_xmult(point p2,point p0,point p1)//p1在p2左返回负,在右边返回正
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
} bool mo_ee(double x,double y)
{
double ret=x-y;
if(ret<0) ret=-ret;
if(ret<eps) return 1;
return 0;
}
bool mo_gg(double x,double y) { return x > y + eps;} // x > y
bool mo_ll(double x,double y) { return x < y - eps;} // x < y
bool mo_ge(double x,double y) { return x > y - eps;} // x >= y
bool mo_le(double x,double y) { return x < y + eps;} // x <= y bool mo_cmp(point a,point b) // 第一次排序
{
if( mo_ee(a.y ,b.y ) )
return mo_ll(a.x, b.x);
return mo_ll(a.y,b.y);
}
bool mo_cmp1(point a,point b) // 第二次排序
{
double len = mo_xmult(b,mo_dian[0],a);
if( mo_ee(len,0.0) )
return mo_ll(mo_distance(mo_dian[0],a),mo_distance(mo_dian[0],b));
return mo_gg(len,0.0);
}
int mo_graham(int n,point *dian,point *stk)
{
int i,top=1;
mo_dian=dian;
sort(mo_dian,mo_dian+n,mo_cmp);
sort(mo_dian+1,mo_dian+n,mo_cmp1);
stk[0]=mo_dian[0];
stk[1]=mo_dian[1];
for(i=2;i<n;++i)
{
while(top>0&&mo_xmult(mo_dian[i],stk[top-1],stk[top])<=0) --top;
stk[++top]=mo_dian[i];
}
return top+1;
} ////////
void getpoint(int tree,point *dian,point *work,vector<int> &cut,int &n_cut,int &n_sheng,int &cutv,int &cutl)
{
cut.clear();
cutv=0;
cutl=n_sheng=n_cut=0;
int i;
for(i=0;i<n;++i)
{
if((1<<i)&tree)//cut
{ cut.push_back(i);
n_cut++;
cutv+=info[i].v;
cutl+=info[i].l;
}else
{
work[n_sheng++]=dian[i];
}
}
}
double zhou(point *dian,int n)
{
int i;
double ret=0;
for(i=0;i<n;++i)
{
ret+=sqrt(
(dian[(i+1)%n].x-dian[i].x)*(dian[(i+1)%n].x-dian[i].x)
+(dian[(i+1)%n].y-dian[i].y)*(dian[(i+1)%n].y-dian[i].y)
);
}
return ret;
}
int main()
{
int i,ncase=1;
while(scanf("%d",&n),n)
{
for(i=0;i<n;++i)
{
scanf("%lf%lf%d%d",&dian[i].x,&dian[i].y,&info[i].v,&info[i].l);
}
int maxofi=(1<<n)-1;
int cutvalue=999999999;
double l_sheng;
int cutn;
vector<int> cut;
vector<int> tempcut;
point work[20];
for(i=0;i<maxofi;++i)
{
int tempcutn,shengyun;
int tempcutv,cutl;
int ret;
double zhouchang;
getpoint(i,dian,work,tempcut,tempcutn,shengyun,tempcutv,cutl);
if(shengyun==1)
{
zhouchang=0;
}else if(shengyun==2)
{
zhouchang=mo_distance(work[0],work[1])*2;
}else
{
ret=mo_graham(shengyun,work,zhan);
zhouchang=zhou(zhan,ret);
} if(mo_ge(cutl,zhouchang))
{
if(tempcutv<cutvalue)
{
cutvalue=tempcutv;
l_sheng=cutl-zhouchang;
cut=tempcut;
cutn=tempcutn;
}else if(tempcutv==cutvalue&&tempcutn<cutn)
{
cutvalue=tempcutv;
l_sheng=cutl-zhouchang;
cut=tempcut;
cutn=tempcutn;
}
}
}
if(ncase!=1) printf("\n");
printf("Forest %d\n",ncase++);
printf("Cut these trees:");
int len=cut.size();
for(i=0;i<len;++i)
{
printf(" %d",cut[i]+1);
}
printf("\n");
printf("Extra wood: %.2lf\n",l_sheng);
}
return 0;
}

poj1873 The Fortified Forest 凸包+枚举 水题的更多相关文章

  1. Uva5211/POJ1873 The Fortified Forest 凸包

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

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

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

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

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

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

    题目链接:UVA 811 Description Once upon a time, in a faraway land, there lived a king. This king owned a ...

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

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

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

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

  7. HDU 1017 A Mathematical Curiosity (枚举水题)

    Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...

  8. CodeForces 444C. DZY Loves Physics(枚举+水题)

    转载请注明出处:http://blog.csdn.net/u012860063/article/details/37509207 题目链接:http://codeforces.com/contest/ ...

  9. 方程的解——枚举&&水题

    题目 链接 给出方程组:$$\displaystyle \left\{\begin{aligned}11x + 13y + 17z = 2471 \\13x + 17y + 11z = 2739\en ...

随机推荐

  1. oracle 内置函数 least decode

    在博客园的第一个博客,为什么叫第一个.... oracle 内置函数 east(1,2,3,4.....) 可以有多个值,最多几个?不知道欢迎补充 ,,,) from dual 这个函数返回是1,就是 ...

  2. [XJOI NOI2015模拟题13] A 神奇的矩阵 【分块】

    题目链接:XJOI NOI2015-13 A 题目分析 首先,题目定义的这种矩阵有一个神奇的性质,第 4 行与第 2 行相同,于是第 5 行也就与第 3 行相同,后面的也是一样. 因此矩阵可以看做只有 ...

  3. 【win8技巧】应用商店里面如何搜索应用app

    win8应用商店搜索app软件的技巧 1.组合键 WIN+C 打开屏幕最右边磁条 2.点击搜索,输入你想搜的软件名称,里面会列出你已经安装的app或者你点击下面的应用商店选项,就可以搜索互联网上应用商 ...

  4. More on 1Password’s Components

    Stefan van As of 1Password fame sent me a more exhaustive list of the libraries and tools used in 1P ...

  5. 调色板QPalette类用法详解(附实例、源码)

    http://blog.csdn.net/rl529014/article/details/51589096

  6. 解析rss和atom文件出现乱码问题

    try { String xmlString = new String(response.data, Charset.forName("UTF-8")); XmlPullParse ...

  7. 学习笔记-[Maven实战]-第三章:Maven使用入门(1)

    说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...

  8. Android fragment 回调函数改进

    由于fragment的onResume()等回调的调用时机与Activity不一样,导致用起来比较麻烦,所以我重新封装了一下回调函数,十分简单. 使用时只需要继承此基类,使用onFragmentXXX ...

  9. hdu1054Strategic Game(树形DP)

    链接 归属简单树形DP 挺简单的 跟第一道一样 就是我跑偏了题意..以为要覆盖点 纠结啊 推了N久 推不出啊 然后就郁闷了 打了局游戏 边想边打 实在想不出 看下题解 跑偏了 分两种情况D 方程见代码 ...

  10. USACO4.13Fence Loops(无向图最小环)

    最近脑子有点乱 老是不想清楚就啪啪的敲 敲完之后一看 咦..样例都过不去 仔细一想 这样不对啊 刚开始就写了一SPFA 最后发现边跟点的关系没处理好 删了..写dfs..还是没转化好 开始搜解题方法 ...