【题目链接】: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. [Spark源代码剖析] DAGScheduler划分stage

    转载请标明出处:http://blog.csdn.net/bigbigdata/article/details/47293263 本文基于Spark 1.3.1 先上一些stage相关的知识点: DA ...

  2. 关于Newtonsoft.json JsonConvert.DeserializeObject反序列化的使用

    object obj = JsonConvert.DeserializeObject("{\"Sta\":3}", paramClass); //paramCl ...

  3. Codeforces 232A - Cycles (构造 + 思维)

    题目链接: 232A - Cycles(点击打开) 题意: 要构成一个存在 \(k\) 个三元环的图,需要多少个点,输出顶点数 \(n\),并输出图. 题解: 题目中的任何图都可以用 \(90\)~ ...

  4. JS学习笔记 - fgm练习 - 输入法下拉框 三元表达式

    <script> window.onload = function() { var oBtn = document.getElementsByTagName('input')[0]; va ...

  5. 【AtCoder Beginner Contest 074 D】Restoring Road Network

    [链接]h在这里写链接 [题意] 给你任意两点之间的最短路. 让你求出原图. 或者输出原图不存在. 输出原图的边长总和的最小值. [题解] floyd算法. 先在原有的矩阵上. 做一遍floyd. 如 ...

  6. TCP的可靠传输机制(简单好理解:分段与流,滑窗,连接,流量控制,重新发送,堵塞控制)

    TCP的几大模块:分段与流,滑窗,连接,流量控制,重新发送,堵塞控制. 1.checksum:在发送TCP报文的时候,里面的信息可能会因为环境的问题,发送变化,这时,接收信号的时候就需要通过check ...

  7. Centos 6 DNS Server 配置

    安装bind yum install -y bind bind-chroot bind-utis 如果是Centos 5 # yum -y install bind caching-nameserve ...

  8. 动态布局Cell的高度

    1 自定义Cell, 在Cell的构造方法里面添加好所有的子控件 2 3 2 在HeightForRowAtIndexPath方法中返回每一行Cell对应的高度 4 5 3 在Cell的layoutS ...

  9. 《Unix编程艺术》读书笔记(1)

    <Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...

  10. swift 旋转加载动画

    https://github.com/naoyashiga/RPLoadingAnimation