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\n",mn>m?-1:mn);return 0;
}
P4049 [JSOI2007]合金的更多相关文章
- bzoj1027 [JSOI2007]合金
1027: [JSOI2007]合金 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2671 Solved: 703[Submit][Status][ ...
- bzoj 1027 [JSOI2007]合金(计算几何+floyd最小环)
1027: [JSOI2007]合金 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2970 Solved: 787[Submit][Status][ ...
- BZOJ 1027 [JSOI2007]合金
1027: [JSOI2007]合金 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2605 Solved: 692[Submit][Status][ ...
- bzoj千题计划123:bzoj1027: [JSOI2007]合金
http://www.lydsy.com/JudgeOnline/problem.php?id=1027 因为x+y+z=1,所以z=1-x-y 第三维可以忽略 将x,y 看做 平面上的点 简化问题: ...
- [bzoj 1027][JSOI2007]合金(解析几何+最小环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1027 分析: 首先因为一个合金的和为1,所以考虑2个材料合金能否合成一个需求合金的时候 ...
- 1027: [JSOI2007]合金 - BZOJ
Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的 ...
- [JSOI2007]合金
Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新 ...
- BZOJ1027 [JSOI2007]合金 【计算几何 + floyd】
题目 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金的 ...
- BZOJ 1027 JSOI2007 合金 计算几何+Floyd
题目大意:给定一些合金,选择最少的合金,使这些合金能够按比例合成要求的合金 首先这题的想法特别奇异 看这题干怎么会想到计算几何 并且计算几何又怎么会跟Floyd挂边 好强大 首先因为a+b+c=1 所 ...
随机推荐
- 让元素div消失在视野中
让元素div消失在视野中1.position:absolute/relative/fixed + 方位 top/bottom/left/right: -9999px2.display:none3.vi ...
- P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1<...<Ti和Ti>Ti+1>…>TK可以看出这题涉及最长上升子序列和最长下降子序列 2 ...
- 洛谷——P3369 【模板】普通平衡树(splay)(基础splay,维护一些神奇的东东)
P3369 [模板]普通平衡树 平衡树大法好,蒟蒻(博主)最近正在收集高级数据结构的碎片,企图合成数据结构的元素之力来使自己的RP++... 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...
- kvm virsh命令详解
[root@ok home]# virsh list Id Name State ---------------------------------------------------- 1 13sv ...
- 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交
[题解] 题意就是判断树上两条链是否有交.口诀是“判有交,此链有彼祖”.即其中一条链的端点的Lca在另一条链上. 我们设两条链的端点的Lca中深度较大的为L2,对L2与另一条链的两个端点分别求Lca, ...
- Python基础(四) 基础拾遗、数据类型进阶
一.基础拾遗 (一).变量作用域 外层变量,可以被内层变量直接调用:内层变量,无法被外层变量使用.这种说法在其它语言中适用,在python中除了栈以外,正常的变量作用域,只要执行声明并在内存中存在,该 ...
- type="application/javascript"
type="application/javascript" html script 标签中 type有如下这些值,请问分别是什么意思,在什么情况下使用? type="te ...
- Go语言语法说明
Go语言语法说明 go语言中的go func(){}() 表示以并发的方式调用匿名函数func 深入讲解Go语言中函数new与make的使用和区别 前言 本文主要给大家介绍了Go语言中函数new与ma ...
- android Fragment用法
Fragment常用的三个类:android.app.Fragment 主要用于定义Fragmentandroid.app.FragmentManager 主要用于在Activity中操作Fragme ...
- 放大的X
Problem Description 请你编程画一个放大的’X’.如3*3的’X’应如下所示: X X XX X 5*5的’X’如下所示:X X X X X X XX X Input 输入数据第 ...