【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1027

【题意】

【题解】



因为和为1;

所以只要知道两个属性第三个属性就能用1减出来了;

然后把每个合金材料化为平面坐标上的二维坐标;

两个合金能够合成的新合金的坐标就在这两个合金的连线上。

你可以假设两个合金的量分别为a,b;

对于某一种物质

新的合金该物质的含量为

(ap1+bp2)/(a+b)

=q*p1+w*p2;

这里(q+w)=1

然后代入两点式可证新的点必然在其上.

所以两个合金能够合成的新的合金必然在它们的连线上.

然后有多个合金。

要求你把这些合金合成客户所需要的合金。

可以想象成两个点集S1和S2

要在S1中选择最少的点集;

使得这些点集形成的闭包包围住了整个S2;

(可以证明只要闭包包住了S2,则S2里面的点集都能得到);

然后用计算几何搞出来S1中任意两个点(i,j)是否S2整个在其左侧.

如果是的话在(i,j)之间连一条边,边权为1;

然后求最小环就是答案了;

这里get到了求最小环的新姿势。

然后这个程序漏了两种情况;

就是ans=1和ans=2的情况。

对于这两种情况是要特判的;

因为这两种情况不是一个闭包了(对应了一个点和一条线)

没办法用闭包涉及到。

所以要加上一个点和两个点的特判;

(很懒并没有加上)

数据很弱啊,不想加了。知道就好。



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x) typedef pair<int, int> pii;
typedef pair<LL, LL> pll; const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 510;
const int INF = 0x3f3f3f3f; struct point
{
double x, y;
point operator -(const point z)
{
point re;
re.x = x - z.x;
re.y = y - z.y;
return re;
}
double operator * (const point z)
{
return x*z.y - y*z.x;
}
double operator ^ (const point z)
{
return x*z.x + y*z.y;
}
} a[N], b[N]; int m, n;
int d[N][N], f[N][N];
int ans = INF; void input_data()
{
rei(m), rei(n);
double t;
rep1(i, 1, m)
{
ref(a[i].x), ref(a[i].y), ref(t);
}
rep1(i, 1, n)
{
ref(b[i].x), ref(b[i].y), ref(t);
}
} void ga()
{
memset(d, 0x3f, sizeof d);
rep1(i,1,m)
rep1(j, 1, m)
{
int k;
for (k = 1; k <= n;k++)
{
double cross = (a[i] - b[k])*(a[j] - b[k]);
if (cross > 1e-7)
break;
if (fabs(cross) < 1e-7 && (a[i] - b[k] ^ a[j] - b[k]) > 1e-7)
break;
}
if (k == n + 1)
d[i][j] = 1;
} } void fl()
{
memcpy(f, d, sizeof f);
rep1(k,1,m)
rep1(i,1,m)
if (f[i][k]<INF)
rep1(j, 1, m)
{
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
rep1(i, 1, m)
ans = min(ans, f[i][i]);
} void o()
{
if (ans == INF)
{
puts("-1");
return;
}
printf("%d\n", ans);
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_data();
ga();
fl();
o();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

【BZOJ 1027】[JSOI2007]合金的更多相关文章

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

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

  2. BZOJ 1027 [JSOI2007]合金

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

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

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

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

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

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

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

  6. bzoj 1027: [JSOI2007]合金【凸包+Floyd】

    参考:https://www.cnblogs.com/zhuohan123/p/3237246.html 因为一c可以由1-a-b得出,所以删掉c,把a,b抽象成二维平面上的点.首先考虑一个客户需求能 ...

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

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

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

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

  9. 1027: [JSOI2007]合金 - BZOJ

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

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

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

随机推荐

  1. Maven搭建Spring Security3.2项目详解

    本来是打算在上一篇SpringMVC+Hibernate上写的,结果发现上面那篇 一起整合的,结果发现上一篇内容实在是太长了,就另起一篇,这篇主要是采用 Maven搭建Spring+SpringMVC ...

  2. WebService学习总结(2)——WebService是什么?

    一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...

  3. ArcGIS教程:地理处理服务演示样例(河流网络)(三)

    设置输出符号系统 步骤: 展开 StoweStreamNet.tbx 并双击创建河流网络模型. 接受默认的 45 公顷并单击确定以运行模型. StreamNet 图层将加入至 ArcMap. 右键单击 ...

  4. 使用 Python 第三方库 daft 绘制 PGM 中的贝叶斯网络

    daft 的官方文档请见 DAFT:BEAUTIFULLY RENDERED PROBABILISTIC GRAPHICAL MODELS. from matplotlib import rc rc( ...

  5. 1.2 Python基础知识 - 字符编码

    计算机中的数据是以二进制方式进行存储的,即只有"0"和"1",二进制是属于数据类型的数据,它只可以和其他进制的数据类型进行转换,但是不能存储其他字符,例如:字母 ...

  6. Java核心技术 卷Ⅰ 基础知识(4)

    第六章 接口与内部类 接口 特性 接口与抽象类 对象克隆 接口与回调 内部类 使用内部类访问对象状态 内部类的特殊语法规则 局部内部类 匿名内部类 静态内部类 代理 Class[] in=new Cl ...

  7. HTML 5 中FileReader的使用

    FileReader 接口主要用来把文件读入到内存中,而且读取文件里的数据.FileReader接口提供了一个异步API,使用该API能够在浏览器主线程中异步訪问文件系统 ,读取文件里的数据. Fil ...

  8. struts2注入类

    struts2是能够注入一个对象的,那么一定须要继承ModelDriven的泛型接口. package com.test.action; import com.opensymphony.xwork2. ...

  9. [array] leetCode-1-Two Sum-Easy

    leetCode-1-Two Sum-Easy descrition Given an array of integers, return indices of the two numbers suc ...

  10. ocx 中使用CImage和CComPtr

    #include <atlimage.h> using namespace ATL;