zoukankan      html  css  js  c++  java
  • P4049 [JSOI2007]合金

    传送门

    我数学可能白学了……

    因为三个数加起来等于(1),那么只要用前两个数就能表示,那么就能把每一种金属看成一个二维向量。考虑只有两个向量的时候,设这两个向量为(a,b),那么一个向量(c)能被表示也就是说存在(ax+by=c)(x+y=1),根据数学老师说的那么(c)(a)(b)的终点连成的直线上,那么这里因为(x)(y)非负所以是在这条线段上。推广一下(我也不知道怎么推广),有(n)个向量的时候能表示的范围就在这(n)个点的凸包里

    于是就转化为求一个合金构成的点数最少的凸包且要完全包住顾客的凸包

    那么就枚举所有的点对,如果所有顾客都在((i,j))这条边的同一侧,那么就加入这条边。最后跑一个floyd求最小环

    //minamoto
    #include<bits/stdc++.h>
    #define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
    #define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
    #define eps 1e-10
    using namespace std;
    template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
    const int N=505;
    struct node{
    	double x,y;
    	node(){}
    	node(double x,double y):x(x),y(y){}
    }p[N],e[N];
    double cross(node a,node b,node c){return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}
    inline bool check(node a,node b,node c){return (a.x>c.x&&b.x>c.x)||(a.x<c.x&&b.x<c.x)||(a.y>c.y&&b.y>c.y)||(a.y<c.y&&b.y<c.y);}
    int g[N][N];bool flag;double res;int mn=0x3f3f3f3f;
    //inline double abs(double x){return x<0?-x:x;}
    int main(){
    //	freopen("testdata.in","r",stdin);
    	int n,m;scanf("%d%d",&m,&n);
    	fp(i,1,m)scanf("%lf%lf%lf",&e[i].x,&e[i].y,&res);
    	fp(i,1,n)scanf("%lf%lf%lf",&p[i].x,&p[i].y,&res);
    	fp(i,1,m){
    		flag=true;
    		fp(j,1,n)if(abs(e[i].x-p[j].x)>eps||abs(e[i].y-p[j].y)>eps){flag=false;break;}
    		if(flag)return puts("1"),0;
    	}
    	memset(g,0x3f,sizeof(g));
    	fp(i,1,m)fp(j,1,m)if(i!=j){
    		if(abs(e[i].x-e[j].x<eps)&&abs(e[i].y-e[j].y)<eps)continue;
    		flag=true;
    		fp(k,1,n)if(cross(e[i],e[j],p[k])<-eps){flag=false;break;}
    		if(!flag)continue;
    		fp(k,1,n){
    			res=cross(e[i],e[j],p[k]);
    			if(res<eps&&res>-eps&&check(e[i],e[j],p[k])){flag=false;break;}
    		}
    		if(flag)g[i][j]=1;
    	}
    	fp(k,1,m)fp(i,1,m)fp(j,1,m)cmin(g[i][j],g[i][k]+g[k][j]);
    	fp(i,1,m)fp(j,1,m)
    	cmin(mn,i==j?g[i][j]:g[i][j]+g[j][i]);
    	printf("%d
    ",mn>m?-1:mn);return 0;
    }
    
  • 相关阅读:
    python学习笔记(33)pycharm中使用git
    VUE基础3-过滤器与生命周期
    VUE基础2-双向数据绑定
    VUE基础1方法与指令
    HTML基础之JS
    HTML基础之DOM操作
    HTML基础之CSS
    HTML基础之HTML标签
    python学习笔记(32)多线程&多进程
    python学习笔记(30)深拷贝、浅拷贝
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9997840.html
Copyright © 2011-2022 走看看