zoukankan      html  css  js  c++  java
  • poj 1873

    哇实验室里正在吵架,爽死了!

    wf水题。显然二进制枚举,注意剪枝,val>ans的时候剪一下,不然会tle。然后就没惹。

    我老人家一开始写了个

    感觉非常垃圾,wa了一发又t了一发。

    感觉自己可以退役了

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include <iostream>
     5 #include <iomanip>
     6 #include <algorithm>
     7 #include <vector>
     8 typedef double db;
     9 #define pdd pair<db,db>
    10 const db eps = 1e-6;
    11 const db pi = acos(-1);
    12 using namespace std;
    13 int sign(db k){
    14     if (k>eps) return 1; else if (k<-eps) return -1; return 0;
    15 }
    16 int cmp(db k1,db k2){return sign(k1-k2);}
    17 struct point{
    18     db x,y;
    19     db v,l;
    20     point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
    21     point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
    22     point operator * (db k1) const{return (point){x*k1,y*k1};}
    23     point operator / (db k1) const{return (point){x/k1,y/k1};}
    24     bool operator <(const point &k1)const {
    25         int c=cmp(x,k1.x);
    26         if(c)return c==-1;
    27         return cmp(y,k1.y)==-1;
    28     }
    29     db abs(){ return sqrt(x*x+y*y);}
    30     db dis(point k1){return ((*this)-k1).abs();}
    31 };
    32 db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
    33 db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
    34 vector<point> convexHull(vector<point> ps){
    35     int n = ps.size();if(n<=1)return ps;
    36     sort(ps.begin(),ps.end());
    37     vector<point> qs(n*2);int k=0;
    38     for(int i=0;i<n;qs[k++]=ps[i++])
    39         while (k>1&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;
    40     for(int i=n-2,t=k;i>=0;qs[k++]=ps[i--])
    41         while (k>t&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;
    42     qs.resize(k-1);
    43     return qs;
    44 }
    45 int n;
    46 point p[19];
    47 vector<point> v;
    48 db res=0,sum=1e9;int ans=-1;
    49 void slove(int x){
    50     v.clear();
    51     db l1=0,val=0;
    52     for(int i=0;i<n;i++){
    53         if(1&(x>>i)){//砍了
    54             l1+=p[i].l;
    55             val+=p[i].v;
    56         } else{
    57             v.push_back(p[i]);
    58         }
    59     }
    60     if(cmp(val,sum)>=0)
    61         return;
    62     v=convexHull(v);
    63     db l2=0;
    64     for(int i=0;i<v.size();i++){
    65         l2+=v[i].dis(v[(i+1)%v.size()]);
    66     }
    67     if(v.size()==1)l2=0;
    68     if(cmp(l1,l2)>=0){//阔以
    69         sum=val;
    70         res=l1-l2;
    71         ans=x;
    72     }
    73 }
    74 int main(){
    75     int cas = 0;
    76     while (scanf("%d",&n)&&n){
    77         cas++;
    78         for(int i=0;i<n;i++){
    79             scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i].v,&p[i].l);
    80         }
    81         for(int i=1;i<(1<<n)-1;i++){
    82             slove(i);
    83         }
    84         if(cas>=2)printf("
    ");
    85         printf("Forest %d
    ",cas);
    86         printf("Cut these trees:");
    87         for(int i=0;i<n;i++){
    88             if((ans>>i)&1){
    89                 printf(" %d",i+1);
    90             }
    91         }
    92         printf("
    Extra wood: %.2f
    ",res);
    93         res=0,sum=1e9;
    94     }
    95 }
    View Code
  • 相关阅读:
    vue 多层级嵌套组件传值 provide 和 inject
    vue 消息订阅与发布 实现任意组件间的通信
    成功
    疯掉的拼接
    解析发送
    一条条发
    com发送
    字符串拼接
    COM
    笨方法的combox级联
  • 原文地址:https://www.cnblogs.com/MXang/p/10446854.html
Copyright © 2011-2022 走看看