zoukankan      html  css  js  c++  java
  • The Fortified Forest POJ

    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
    ",++kase);
    74         printf("Cut these trees:");
    75         for(int i=0;i<id;i++) printf(" %d",ans[i]+1);
    76         printf("
    Extra wood: %.2f
    ",res);
    77     }
    78     return 0;
    79 }
    View Code
  • 相关阅读:
    Eclipse中使用GIT提交文件至本地
    Eclipse中使用GIT更新项目
    Eclipse使用Git检出项目
    JQuery选择器排除某元素实现js代码
    如何在使用layer.prompt在输入值为空的情况下点击确定继续执行逻辑?
    怎样验证layer.prompt输入的值为数值型???
    使用ECharts制作图形时,如何设置指定图形颜色?
    JS中通过LayUI的layer.prompt弹出文本输入层,多个按钮回调获取输入值
    MAVEN环境配置
    【Linux】Tomcat安装及端口配置
  • 原文地址:https://www.cnblogs.com/yijiull/p/7375970.html
Copyright © 2011-2022 走看看