参考:https://www.cnblogs.com/zhuohan123/p/3237246.html

因为一c可以由1-a-b得出,所以删掉c,把a,b抽象成二维平面上的点。首先考虑一个客户需求能被哪些原料配出来:两个原料点连线上的点都可以,要是多个原料点,那么这些线的向量构成的凸包中的点都可以

所以得到了一个n三方算法:枚举每两个原料点,看是否所有需求点都在这条向量的半平面里,是则连1,然后Floyd求最小环即可

但是有非常多恶心的特判……

1.需求点重合为一点

2.需求点出现在两种原料点所在直线上的情况

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=505,inf=1e9;
const double eps=1e-10;
int m,n,a[N][N];
double c;
struct dian
{
double x,y;
dian(double X=0,double Y=0)
{
x=X,y=Y;
}
dian operator - (const dian &a) const
{
return dian(x-a.x,y-a.y);
}
}q[510],p[510];
dian V(dian a,dian b)
{
return dian(b.x-a.x,b.y-a.y);
}
double cj(dian a,dian b)
{
return a.x*b.y-b.x*a.y;
}
bool ok(dian s,dian t,dian p)
{
return !((s.x>p.x&&t.x>p.x)||(s.x<p.x&&t.x<p.x)||(s.y>p.y&&t.y>p.y)||(s.y<p.y&&t.y<p.y));
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&c);
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf",&q[i].x,&q[i].y,&c);
for(int i=1;i<=m;i++)
{
bool flag=1;
for(int j=1;j<=n;j++)
if(abs(p[i].x-q[j].x)>eps||abs(p[i].y-q[j].y)>eps)
flag=0;
if(flag)
{
printf("1\n");
return 0;
}
}
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
a[i][j]=inf;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
if(i!=j)
{
if(abs(p[i].x-p[j].x)<eps&&abs(p[i].y-p[j].y)<eps)
continue ;
int can=1;
for(int k=1;k<=n;k++)
if(cj(p[j]-p[i],q[k]-p[i])<-eps)
can=0;
if(can)
{
for(int k=1;k<=n;k++)
{
double cp=cj(p[j]-p[i],q[k]-p[i]);
if(cp<eps&&cp>-eps&&(!ok(p[i],p[j],q[k])))
can=0;
}
}
if(can)
a[i][j]=1;
}
int ans=inf;
for(int k=1;k<=m;k++)
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
{
if(i!=j&&a[i][j]+a[j][i]<ans)
ans=a[i][j]+a[j][i];
if(i==j&&a[i][j]<ans)
ans=a[i][j];
}
printf("%d\n",ans==inf?-1:ans);
return 0;
}

bzoj 1027: [JSOI2007]合金【凸包+Floyd】的更多相关文章

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

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

  2. BZOJ 1027: [JSOI2007]合金 (计算几何+Floyd求最小环)

    题解就看这位仁兄的吧-不过代码还是别看他的了- 同样的方法-我200ms,他2000ms. 常数的幽怨- CODE #include <bits/stdc++.h> using names ...

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

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

  4. BZOJ 1027 [JSOI2007]合金

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

  5. 【BZOJ 1027】 (凸包+floyd求最小环)

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

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

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

  7. BZOJ 1027 [JSOI2007]合金 ——计算几何

    我们可以把每一种金属拆成一个二维向量,显然第三维可以计算出来,是无关的. 我们只需要考虑前两维的情况,显然可以构成点集所形成的凸包内. 然后我们枚举两两的情况,然后可以发现如果所有的点都在一侧是可以选 ...

  8. 【BZOJ】1027: [JSOI2007]合金(凸包+floyd)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1027 题意:$n$种材料,$m$种需求.每种材料有三个属性,给出三个属性的含量(和为1),问能否通过 ...

  9. 1027: [JSOI2007]合金 - BZOJ

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

随机推荐

  1. FusionCharts for Flex 如何更改图表数据

    FusionCharts allows to change chart data and re-render the chart, after it has loaded on the user’s ...

  2. XCode 或者ITune 添加账号时,提示:This action could not be completed. 或者 Access Privileges

    当遇到This action could not be completed 或者 You do not have enough access privileges for this operation ...

  3. zoj4027 Sequence Swapping

    首先容易想到二维方程dp(i,j),表示第i个左括号去匹配到第j个右括号时产生的最大值,但如果如此表示的话,首先需要枚举(i,j)以及一个k即dp(i-1,k). 考虑变化dp(i,j)的表示方法,可 ...

  4. Android 学习路线图(转载自https://blog.csdn.net/lixuce1234/article/details/77947405)

    程序设计 一.java (a)基本语法(如继承.异常.引用.泛型等) Java核心技术 卷I(适合入门) 进阶 Effective Java中文版(如何写好的Java代码) Java解惑 (介绍烂Ja ...

  5. DTRACE FOR MYSQL PHP

    Using DTrace to troubleshoot Apache DTrace for MySQL , Inspecting MySQL with DTrace , MySQL DTrace P ...

  6. mysql查看存储过程show procedure status;

    1.mysql查看存储过程(函数) 2.MySQL查看触发器 查看触发器 语法:SHOW TRIGGERS [FROM db_name] [LIKE expr] 实例:SHOW TRIGGERS\G ...

  7. 我和 HelloGitHub

    我? 我是一个本科学历.无大厂经历,普通的 Python 程序员. 虽然是计算机专业,但是大学玩了四年(Dota)后,发现自己无一技能傍身,要饿死啦!偶然间接触了 Python 这门编程语言,发现编程 ...

  8. 随机森林、gbdt算法

    http://blog.csdn.net/songzitea/article/details/10035757 http://blog.csdn.net/holybin/article/details ...

  9. 去掉小程序textarea上的完成按钮栏

    小程序textarea上会自动多一个完成按钮,如下图所示,如果是mpVue,在textarea添加     :show-confirm-bar="false"     即可.  

  10. 运行计划中cost计算方法

    概念: blevel:二元高度=索引高度-1 clustering_factor:集群因子,通过索引扫面得出的要查询table的blocks数量,clustering_factor接近table的bl ...