分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

P4049 [JSOI2007]合金

发布时间:2023-09-06 02:23责任编辑:白小东关键词:暂无标签

传送门

我数学可能白学了……

因为三个数加起来等于\(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-10using 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\n",mn>m?-1:mn);return 0;}

P4049 [JSOI2007]合金

原文地址:https://www.cnblogs.com/bztMinamoto/p/9997840.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved