题目大意:

国王有一片森林,巫师需要从所有树中选出一些做成围栏把其他树围起来,

每棵树都有其对应的价值 v 和能作为围栏的长度 l

要求最小价值,若存在多种最小价值的方案则选择余下长度更少的

树木较少 状态压缩 枚举所有状态

计算当前的状态 被选中的 树的价值和长度

其他 被围起来(未被选中)的树去求凸包

计算凸包的边长(即围栏的最小长度)

判断选中的树是否能围住凸包 再更新答案

#include <cstdio>
#include <algorithm>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std; const double eps=1e-;
double add(double a,double b) {
if(abs(a+b)<eps*(abs(a)+abs(b))) return ;
return a+b;
}
struct P {
double x,y;
P(){};
P(double _x,double _y):x(_x),y(_y){};
P operator - (P p) {
return P(add(x,-p.x),add(y,-p.y)); }
P operator + (P p) {
return P(add(x,p.x),add(y,p.y)); }
P operator * (double d) {
return P(x*d,y*d); }
double dot(P p) {
return add(x*p.x,y*p.y); }
double det(P p) {
return add(x*p.y,-y*p.x); }
}p1[], p2[], p3[];
int n;
double v[], l[], ansv, ansl;
bool cmp(P a,P b) {
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
double length(P a,P b) {
return sqrt((a-b).dot(a-b));
}
double andrew(int n)
{
sort(p2,p2+n,cmp);
int k=;
for(int i=;i<n;i++) {
while(k> && (p3[k-]-p3[k-]).det(p2[i]-p3[k-])<=)
k--;
p3[k++]=p2[i];
}
for(int i=n-,t=k;i>=;i--) {
while(k>t && (p3[k-]-p3[k-]).det(p2[i]-p3[k-])<=)
k--;
p3[k++]=p2[i];
} // 凸包上的点存入p3 double res=;
for(int i=;i<k;i++) // 计算凸包边长 即围栏长度
res+=length(p3[i],p3[i-]);
return res;
}
bool solve(int task)
{
int cnt=, t=task;
double cntv=, cntl=;
for(int i=;i<n;i++) {
if(task&) cntv+=v[i], cntl+=l[i]; // 被选中的 计算价值及长度
else p2[cnt++]=p1[i]; // 为被选中的存入p2 待求凸包
task >>= ;
}
if(cntv>ansv) return ; // 价值大于已有答案价值 返回0
double tblen=andrew(cnt); // 求凸包边长 即围栏所需长度
if(tblen>cntl) return ; // 若长度不足于围成围栏 返回0 if(cntv==ansv) ansl=min(ansl,cntl-tblen); // 更新余下长度的答案
else ansv=cntv, ansl=cntl-tblen; // 存在更小的价值 更新价值和长度
return ; // 更新了答案 返回1 记录新的状态
} int main()
{
int c=;
while(~scanf("%d",&n)) {
if(n==) break; c++;
for(int i=;i<n;i++) {
scanf("%lf%lf",&p1[i].x,&p1[i].y);
scanf("%lf%lf",&v[i],&l[i]);
} int ans;
ansv=ansl=INF;
int N=(<<n)-;
for(int i=;i<N;i++) // 枚举所有状态
if(solve(i)) ans=i; printf("Forest %d\n",c);
printf("Cut these trees:");
for(int i=;i<n;i++) {
if(ans & ) printf(" %d",i+);
ans >>= ;
}
printf("\nExtra wood: %.2f\n\n",ansl);
} return ;
}

POJ 1873 /// 状压+凸包的更多相关文章

  1. POJ 2923 状压好题

    Relocation Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2631   Accepted: 1075 Descri ...

  2. POJ 3254 (状压DP) Corn Fields

    基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...

  3. POJ 3254 状压DP

    题目大意: 一个农民有一片n行m列 的农场   n和m 范围[1,12]  对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...

  4. poj 1170状压dp

    题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...

  5. POJ 2411 状压DP经典

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16771   Accepted: 968 ...

  6. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  7. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

  8. poj 1185 状压dp+优化

    http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 291 ...

  9. POJ 2441 状压DP

    Arrange the Bulls Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 5289   Accepted: 2033 ...

随机推荐

  1. 2019.7.3模拟 七星连珠(行列式+随机+k进制FWT)

    题目大意: 给一个\(n*n\)的矩阵,对于所有排列p,记录\(a[i][p[i]]\)的k进制下不进位加法的结果,问所有被记录过的数. \(n<=50,p=2.3,0<=a[i][j]& ...

  2. CF696B Puzzles(期望dp)

    传送门 解题思路 比较有意思的一道题.首先假如这个点\(x\)只有\(1\)个儿子\(u\),那么显然可得\(dp[u]=dp[x]+1\).继续如果多加一个儿子\(p\),那么\(p\)在\(u\) ...

  3. HAOI 2006 受欢迎的牛 (洛谷2341)

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢"是可以传递的--如果A喜 欢B,B喜 ...

  4. NX二次开发-NXOPEN自动切换到工程图模块

    UFUN的API里是没有切换到工程图的函数的,NXOPEN里是有方法可以用的.不过应该是不支持NX9以下的版本. NX9的不能录制出来,在UI类里有方法 NX9+VS2012 #include < ...

  5. 9.RabbitMQ Topic类型交换机

    RabbitMQ消息服务中Topic类型交换机根据通配符路由消息,*代表一个单词,#代表代表0或多个单词.   生产者 消费者   代码 Producer.java   package com.tes ...

  6. class6_scale尺度

    最终的运行效果(程序见序号7) #!/usr/bin/env python# -*- coding:utf-8 -*-# --------------------------------------- ...

  7. D.Country Meow 最小球覆盖 三分套三分套三分 && 模拟退火

    // 2019.10.3 // 练习题:2018 ICPC 南京现场赛 D Country Meow 题目大意 给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值.   思路 非常裸的最小 ...

  8. CSS3新属性之---flex box布局实例

    flex box布局实例 flex的强大之处在于不管什么布局,几行命令即可实现 /*本节模板div元素(代表骰子的一个面)是Flex容器,span元素(代表一个点)是Flex项目.如果有多个项目,就要 ...

  9. Codeforces 479【C】div3

    题目链接:http://codeforces.com/problemset/problem/977/C 题意:给你n个数字,输出任意一个数字,这个数字刚好大于等于,序列里面k个数字. 题解:排个序,第 ...

  10. Activiti学习笔记7 — ReceiveTask机器自动任务的使用

    一. 创建流程规则,如下图 二.发布流程 /** * 2.发布一个流程 */ @Test public void testDeployProcess() { RepositoryService rep ...