传送门

我数学可能白学了……

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

P4049 [JSOI2007]合金的更多相关文章

  1. bzoj1027 [JSOI2007]合金

    1027: [JSOI2007]合金 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2671  Solved: 703[Submit][Status][ ...

  2. bzoj 1027 [JSOI2007]合金(计算几何+floyd最小环)

    1027: [JSOI2007]合金 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2970  Solved: 787[Submit][Status][ ...

  3. BZOJ 1027 [JSOI2007]合金

    1027: [JSOI2007]合金 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2605  Solved: 692[Submit][Status][ ...

  4. bzoj千题计划123:bzoj1027: [JSOI2007]合金

    http://www.lydsy.com/JudgeOnline/problem.php?id=1027 因为x+y+z=1,所以z=1-x-y 第三维可以忽略 将x,y 看做 平面上的点 简化问题: ...

  5. [bzoj 1027][JSOI2007]合金(解析几何+最小环)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1027 分析: 首先因为一个合金的和为1,所以考虑2个材料合金能否合成一个需求合金的时候 ...

  6. 1027: [JSOI2007]合金 - BZOJ

    Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的 ...

  7. [JSOI2007]合金

    Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新 ...

  8. BZOJ1027 [JSOI2007]合金 【计算几何 + floyd】

    题目 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金的 ...

  9. BZOJ 1027 JSOI2007 合金 计算几何+Floyd

    题目大意:给定一些合金,选择最少的合金,使这些合金能够按比例合成要求的合金 首先这题的想法特别奇异 看这题干怎么会想到计算几何 并且计算几何又怎么会跟Floyd挂边 好强大 首先因为a+b+c=1 所 ...

随机推荐

  1. mybatis中resultMap引发的吐血bug

    简单的讲: 问题背景:如果在写mybatis中的resultMap时,不下心将resultMapde id写成映射接口的名字,会发生什么? 结论:单元测试进度条卡住但不报错, Tomcat运行不报错, ...

  2. 2n皇后 - 回溯

    题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...

  3. 剑指offer---正则表达式匹配

    题目:正则表达式匹配 要求:请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所 ...

  4. instance_name,db_name,oracle_sid之间的关系

    一]对ORACLE_SID的理解 --------------------------------------------------------------------------------Ora ...

  5. FTP配置

    常用的匿名FTP配置项   anonymous_enable=YES           是否允许匿名用户访问   anon_umask=022                匿名用户所上传文件的权限 ...

  6. ssh中将常用的命令做别名

    1.vim ~/.bashrc 将光标落到user下面 2. 输入 alias x=‘ssh的命令’ 3.按ESC键,退出输入状态: 4.按:,然后输入wq,保存退出: 5. source ~/.ba ...

  7. 解决CUDA程序的黑屏恢复问题

    本文引用自 http://blog.163.com/yuhua_kui/blog/static/9679964420146183211348/ 问题描述:   在运行CUDA程序时,出现黑屏,过一会儿 ...

  8. [模拟赛FJOI Easy Round #2][T1 sign] (模拟+求字符串重复字串)

    [题目描述] 小Z在无意中发现了一个神奇的OJ,这个OJ有一个神奇的功能:每日签到,并且会通过某种玄学的算法计算出今日的运势.在多次试验之后,小Z发现自己的运势按照一定的周期循环,现在他找到了你,请通 ...

  9. 类中的__call__()

    class A: def __call__(self, *args, **kwargs): print('执行了call方法') def call(self): print('执行call方法') c ...

  10. 【00】angular学习网站

    [00]   学习资料:   http://angularjs.cn/   英文API:http://docs.angularjs.cn/api     中文API;http://www.apjs.n ...