题目

  某公司加工一种由铁、铝、锡组成的合金。他们的工作很简单。首先进口一些铁铝锡合金原材料,不同种类的

原材料中铁铝锡的比重不同。然后,将每种原材料取出一定量,经过融解、混合,得到新的合金。新的合金的铁铝

锡比重为用户所需要的比重。 现在,用户给出了n种他们需要的合金,以及每种合金中铁铝锡的比重。公司希望能

够订购最少种类的原材料,并且使用这些原材料可以加工出用户需要的所有种类的合金。

输入格式

  第一行两个整数m和n(m, n ≤ 500),分别表示原材料种数和用户需要的合金种数。第2到m + 1行,每行三

个实数a, b, c(a, b, c ≥ 0 且 a + b + c = 1),分别表示铁铝锡在一种原材料中所占的比重。第m + 2到m +

n + 1行,每行三个实数a, b, c(a, b, c ≥ 0 且 a + b + c = 1),分别表示铁铝锡在一种用户需要的合金中

所占的比重。

输出格式

 一个整数,表示最少需要的原材料种数。若无解,则输出–1。

输入样例

10 10

0.1 0.2 0.7

0.2 0.3 0.5

0.3 0.4 0.3

0.4 0.5 0.1

0.5 0.1 0.4

0.6 0.2 0.2

0.7 0.3 0

0.8 0.1 0.1

0.9 0.1 0

1 0 0

0.1 0.2 0.7

0.2 0.3 0.5

0.3 0.4 0.3

0.4 0.5 0.1

0.5 0.1 0.4

0.6 0.2 0.2

0.7 0.3 0

0.8 0.1 0.1

0.9 0.1 0

1 0 0

输出样例

5

题解

神题,蒟蒻跪了QAQ

首先第三个点是赘余的,只要两个点满足条件,第三个点一定满足条件,因为它们的和为都为同一个定值

这样我们就可以把材料和产品看做平面中的点,一个产品能被一些材料制作出来,当且仅当该产品在这些材料的凸包中。

问题就变成了使用A集合中的点形成的最小凸包围住B集合中的所有点

如果对A中的点i和j有所有B中的点都在其左侧,则连边i->j

求一个最小环即可。

此时B中的点一定在环上所有边左侧,即在该凸包内

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u]; k != -1; k = ed[k].nxt)
#define eps 1e-9
using namespace std;
const int maxn = 505,maxm = 100005,INF = 1000000000;
struct Point{double x,y;}A[maxn],B[maxn];
int N,M,G[maxn][maxn],ans = INF;
double cross(const Point& a,const Point& b){return a.x * b.y - a.y * b.x;}
double dot(const Point& a,const Point& b){return a.x * b.x + a.y * b.y;}
Point line(const Point& a,const Point& b){return (Point){b.x - a.x,b.y - a.y};}
void floyd(){
REP(k,N)
REP(i,N)
REP(j,N)
G[i][j] = min(G[i][j],G[i][k] + G[k][j]);
REP(i,N) ans = min(ans,G[i][i]);
}
int main(){
fill(G[0],G[0] + maxn * maxn,INF);
scanf("%d%d",&N,&M); double t,tt;
REP(i,N) scanf("%lf%lf%lf",&A[i].x,&A[i].y,&t);
REP(i,M) scanf("%lf%lf%lf",&B[i].x,&B[i].y,&t);
for (int i = 1; i <= N; i++)
for (int j = 1,k; j <= N; j++){
for (k = 1; k <= M; k++){
t = cross(line(A[i],B[k]),line(A[j],B[k]));
tt = dot(line(A[i],B[k]),line(A[j],B[k]));
if (t > eps) break;
if (fabs(t) < eps && tt > eps) break;
}
if (k == M + 1) G[i][j] = 1;
}
floyd();
printf("%d\n",ans == INF ? -1 : ans);
return 0;
}

BZOJ1027 [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. bzoj1027 [JSOI2007]合金

    1027: [JSOI2007]合金 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2671  Solved: 703[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]合金 ——计算几何

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

  6. BZOJ_1027_[JSOI2007]_合金_(计算几何+Floyd求最小环)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1027 共三种金属,\(m\)种材料,给出每种材料中三种金属的占比. 给出\(n\)种合金的三种 ...

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

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

  8. 【bzoj1027】合金

    [bzoj1027]合金 分析 数形结合+计算几何+Floyd最小环. http://blog.csdn.net/popoqqq/article/details/40539273 虽然这样占大家的很不 ...

  9. BZOJ 1027 [JSOI2007]合金

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

随机推荐

  1. Uboot S3C2440 BL1 的流程

    1.   reset 中断向量表 2. 进入reset (1) 设置svc32 模式 (2) flash  I/D caches (3)disable  MMU 和 cache (4)2440 没有o ...

  2. Web前端开发面试技巧

    Web前端开发面试技巧 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. 近 ...

  3. 小程序里面使用wxParse解析富文本导致页面空白等

    在部分安卓手机上会出现白屏的情况且有些ios手机上图文混排上,图片显示不出问题 解决:把插件里面的console.dir去掉即可(原因在于安卓手机无法解析console.dir) 有些图片解析出来下面 ...

  4. redis学习1(nosql)

    一. 互联网时代背景下大机遇,为什么用nosql 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付.在那个时候,更多的都是静态网页,动态交互类型的网站 ...

  5. 我理解中的Hadoop HDFS分布式文件系统

    一,什么是分布式文件系统,分布式文件系统能干什么 在学习一个文件系统时,首先我先想到的是,学习它能为我们提供什么样的服务,它的价值在哪里,为什么要去学它.以这样的方式去理解它之后在日后的深入学习中才能 ...

  6. 关于学习less后一些感悟

    学习了一天的less发现,自己被自己弄的晕头转向,好在是学明白了! 一.写自己的第一个less css样式编程: 网址:http://www.1024i.com/demo/less/document. ...

  7. viewpager 无网络的时候滑动异常

    不知道大家有没有遇到过这种情况,就是框架是viewpager+fragment的架构.然后呢,fragment里面是webview.一般情况下,当没有网的时候,webviwe会说什么找不到网页,然后很 ...

  8. 关于Python、Java、C#语言的一些比较

    不能说某某语言不好! 首先,千万别说某一个语言好不好,应为这样的用词是错的,我曾经在好多场合听到一些程序员说java好,.net不好这类的话. 其实语言不分好坏,只是在具体的某些领域或业务场景上不合适 ...

  9. 途牛banner自动轮播

    <!DOCTYPE html>               <!--申明文档类型:html--> <html lang="en">       ...

  10. 以最省内存的方式把大图片加载到内存及获取Exif信息和获取屏幕高度和宽度的新方法

    我们在加载图片时经常会遇到内存溢出的问题,图片太大,我们加载图片时,一般都是用的如下一般方法(加载本地图片): /** * 不作处理,去加载图片的方法,碰到比较大的图片会内存溢出 */ private ...