题目链接:https://vjudge.net/problem/POJ-1873

题意:n个点(2<=n<=15),给出n个点的坐标(x,y)、价值v、做篱笆时的长度l,求选择哪些点来做篱笆围住另一些点,使得选出的这些点的价值和最小,如果价值和相等要求个数最小。

思路:

  看来这是WF的签到题吧。数据很小,直接二进制枚举 (1<<n),然后对未选出的点求凸包的周长,仅当选出点的长度l的和>=凸包周长时才更新答案。

AC code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; const int maxn=;
const int inf=0x3f3f3f3f; struct Point{
int x,y;
Point():x(),y(){}
Point(int x,int y):x(x),y(y){}
}; int n,cas,val,num,res[maxn],v[maxn],l[maxn],vis[maxn];
double ext;
int top,stack[maxn];
Point pt[maxn],list[maxn]; int cross(Point p0,Point p1,Point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
} double dis(Point p1,Point p2){
return sqrt((double)(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
} bool cmp(Point p1,Point p2){
int tmp=cross(list[],p1,p2);
if(tmp>) return true;
else if(tmp==&&dis(list[],p1)<dis(list[],p2)) return true;
else return false;
} void init(int m){
Point p0=list[];
int k=;
for(int i=;i<m;++i){
if((p0.y>list[i].y)||((p0.y==list[i].y)&&(p0.x>list[i].x))){
p0=list[i];
k=i;
}
}
list[k]=list[];
list[]=p0;
sort(list+,list+m,cmp);
} double graham(int m){
if(m==){
top=;
stack[]=;
}
else{
top=;
stack[]=;
stack[]=;
for(int i=;i<m;++i){
while(top>&&cross(list[stack[top-]],list[stack[top]],list[i])<=) --top;
stack[++top]=i;
}
}
double ret=;
for(int i=;i<top;++i)
ret+=dis(list[stack[i]],list[stack[i+]]);
ret+=dis(list[stack[top]],list[stack[]]);
return ret;
} int main(){
while(scanf("%d",&n),n){
val=num=inf;
for(int i=;i<n;++i)
scanf("%d%d%d%d",&pt[i].x,&pt[i].y,&v[i],&l[i]);
for(int i=;i<(<<n)-;++i){
int t1=,t2=,cnt=;
for(int j=;j<n;++j){
if((i>>j)&){
t1+=v[j],t2+=l[j];
}
else{
list[cnt++]=pt[j];
}
}
init(cnt);
int cnt2=n-cnt;
if((t1<val)||((t1==val)&&(cnt2<num))){
double tmp=graham(cnt);
if(tmp>t2) continue;
val=t1,num=cnt2,ext=t2-tmp;
int t=;
for(int j=;j<n;++j){
if((i>>j)&)
res[t++]=j;
}
}
}
printf("Forest %d\nCut these trees:",++cas);
for(int i=;i<num;++i)
printf(" %d",res[i]+);
printf("\nExtra wood: %.2f\n\n",ext);
}
return ;
}

最新文章

  1. PLC M8000 M8001 M8002 M8003
  2. 【iCore3 双核心板_ uC/OS-III】例程十一:任务消息队列
  3. 有关于psExec的使用
  4. 【转载 来自sdnlab】 开放网络没那么简单
  5. LESS CSS 框架简介(转)
  6. python类class基础
  7. w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常
  8. 多态性Polymorphism
  9. git submoudle提交
  10. ES6随手学
  11. 初次使用Windbg检查C#程序内存
  12. ABAP基础一:ALV基础之ALV的整体结构
  13. &lt;转&gt;Python: __init__.py 用法
  14. Sentry从0到1
  15. helm-locate 使用 everything
  16. ASP.NET MVC5+ 路由特性
  17. purescript 基本试用
  18. c#开源项目收集
  19. C11性能之道:标准库优化
  20. Centos/ubuntu配置SVN服务

热门文章

  1. Ubuntu18.04开机动画(bootsplash)安装
  2. 安装less/sass
  3. 物聯網安全黑客松 IoT Security and Privacy Hackathon
  4. 史上最好用的依赖注入框架Google Guice【转】
  5. win7下如何根据端口号杀掉进程
  6. buoyantSimpleFoam求解器:恒热流壁面【翻译】
  7. 咏南中间件和开发框架全面支持DELPHI10.3.2
  8. XMind 快捷键完整命令
  9. 一个hin秀的小学三年级奥数题 [hin秀]
  10. ubuntu下载自带的java-1.8