题目描述

  某公司加工一种由铁、铝、锡组成的合金。他们的工作很简单。首先进口一些铁铝锡合金原材料,不同种类的
原材料中铁铝锡的比重不同。然后,将每种原材料取出一定量,经过融解、混合,得到新的合金。新的合金的铁铝
锡比重为用户所需要的比重。 现在,用户给出了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。


  • 题解

    • $a+b+c=1$所以忽略$c$,根据定比分点原则两个点可以表示的点组成它们连线段,推广一下;
    • 所以对$n$个点求出凸包,问题即用$m$个点去圈住凸包求最小点数;
    • 对两个材料$i,j$,如果凸包上的点都在连线$\vec{ij}$的左边就$i$向$j$连边,$floyd$求所有$dis[i][i]$即可;
    • 特判:
    • 当凸包是一个点时特判;
    • 当凸包是一条直线时,如果叉积为$0$还需要盖住所有点才可以加边,用点积特判;
    •  #include<bits/stdc++.h>
      #define db double
      #define inf 0x3f3f3f3f
      #define il inline
      #define eps 1e-7
      using namespace std;
      const int N=;
      int n,m,top,dis[N][N];
      il int dcmp(db x){return fabs(x)<eps?:x<?-:;}
      struct poi{
      db x,y;
      poi(db _x=,db _y=):x(_x),y(_y){};
      il poi operator -(const poi&A)const{return poi(x-A.x,y-A.y);}
      il bool operator <(const poi&A)const{return x==A.x?y<A.y:x<A.x;}
      }p1[N],p2[N],q[N];
      il db crs(poi A,poi B){return A.x*B.y-A.y*B.x;}
      il db dot(poi A,poi B){return A.x*B.x+A.y*B.y;}
      il bool spj(){
      int fg=;
      for(int i=;i<=n;++i)if(dcmp(p1[].x-p1[i].x)||dcmp(p1[].y-p1[i].y)){fg=;break;}
      for(int i=;i<=m;++i)if(dcmp(p1[].x-p2[i].x)||dcmp(p1[].y-p2[i].y)){fg=;break;}
      if(!fg){puts("");return true;}
      else return false;
      }
      il void convex(){
      sort(p2+,p2+m+);
      q[top=]=p2[];
      if(m==)return;
      for(int i=;i<=m;++i){
      while(top>&&dcmp(crs(q[top]-q[top-],p2[i]-q[top]))<=)top--;
      q[++top]=p2[i];
      }
      int now=top;
      for(int i=m-;i;--i){
      while(top>now&&dcmp(crs(q[top]-q[top-],p2[i]-q[top]))<=)top--;
      q[++top]=p2[i];
      }
      top--;
      }
      il bool judge(int a,int b){
      int i; poi p = p1[b]-p1[a];
      for(i=;i<=top;++i){
      int c = dcmp(crs(p, q[i]-p1[a]));
      if(c>)break;
      if(!c&&dcmp(dot(q[i]-p1[b], q[i]-p1[a]))>)break;
      }
      return i==top+?true:false;
      }
      int main(){
      #ifndef ONLINE_JUDGE
      freopen("bzoj1027.in","r",stdin);
      freopen("bzoj1027.out","w",stdout);
      #endif
      db tmp;
      scanf("%d%d",&n,&m);
      for(int i=;i<=n;++i)scanf("%lf%lf%lf",&p1[i].x,&p1[i].y,&tmp);
      for(int i=;i<=m;++i)scanf("%lf%lf%lf",&p2[i].x,&p2[i].y,&tmp);
      if(spj())return ;
      convex();
      memset(dis,0x3f,sizeof(dis));
      for(int i=;i<=n;++i)
      for(int j=;j<=n;++j)if(i!=j){
      if(judge(i,j))dis[i][j]=;
      }
      for(int k=;k<=n;++k)
      for(int i=;i<=n;++i)
      for(int j=;j<=n;++j){
      if(dis[i][j]>dis[i][k]+dis[k][j])
      dis[i][j] = dis[i][k]+dis[k][j];
      }
      int ans=inf;
      for(int i=;i<=n;++i)ans = min(ans, dis[i][i]);
      if(ans==inf)puts("-1"); else printf("%d\n",ans);
      return ;
      }

      bzoj1027

bzoj1027【JSOI2007】合金的更多相关文章

  1. bzoj1027 [JSOI2007]合金

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

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

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

  3. BZOJ1027 [JSOI2007]合金 【计算几何 + floyd】

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

  4. 【bzoj1027】合金

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

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

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

  6. BZOJ 1027 [JSOI2007]合金

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

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

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

  8. 1027: [JSOI2007]合金 - BZOJ

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

  9. [JSOI2007]合金

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

  10. P4049 [JSOI2007]合金

    传送门 我数学可能白学了-- 因为三个数加起来等于\(1\),那么只要用前两个数就能表示,那么就能把每一种金属看成一个二维向量.考虑只有两个向量的时候,设这两个向量为\(a,b\),那么一个向量\(c ...

随机推荐

  1. Trait 是什么东西

    PHP官方手册里面写的内容是 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少 ...

  2. ansible软件2

    常用软件安装及使用目录  ansible使用1 第1章 copy模块 1.1 创建文件及写入内容 1. [root@m01 scripts]# ansible oldboy -m copy -a &q ...

  3. 使用sass与compass合并雪碧图(一)

    雪碧图就是很多张小图片合并成一张大图片,以减少HTTP请求,从而提升加载速度.有很多软件可以合并雪碧图,但通常不太容易维护,使用compass生成雪碧图应该算是非常方便的方法了,可以轻松的生成雪碧图, ...

  4. pairwork(黄敬博12061156和黄伟龙12061172)

    结对编程: 结对编程的优缺点: 优点: 1.相互督促,共同为了完成目标而努力: 2.节省时间,通过将疑难问题分开解决,共同讨论,实现了更高效的时间利用率: 3.能力互补,提高代码的质量,同时也提高了测 ...

  5. [BUAA软工]第0次个人作业

    [BUAA软工]第0次个人作业 本次作业所属课程 : 2019BUAA软件工程 本次作业要求: 第0次个人作业 我在本课程的目标: 熟悉软件工程流程,规范开发习惯 本次作业的帮助: 熟悉课程流程 Pa ...

  6. 项目Beta冲刺(团队)第三天

    1.昨天的困难 记住密码打勾之后点击登录记住密码这四个字会变成省略号 点赞点击以后本应该呈现的爱心形状变成了方块 2.今天解决的进度 成员 进度 陈家权 私信模块探索ing,回复详情界面设计 赖晓连 ...

  7. Hibernate利用纯sql

    String hql = "select * from shop where shop.strid in(select strid from moneythreeshop where mon ...

  8. Software Defined Networking(Week 2, part 1)

    History of SDN 1.1 - 1.2 本节讨论从上世纪八十年代时到现在为止出现的SDN的思想和发展历史.了解历史,可以明白技术后面的成因以及一些原则,并从架构上去大致掌握.了解一些主旨. ...

  9. 《构建之法》第四&十七章读书笔记

     <构建之法>第四&十七章读书笔记 一.         前言 再次阅读<构建之法>,愈发被其中生动有趣的举例吸引.作为一本给予软件工程学生的书籍,其不以枯燥的理论知识 ...

  10. 第三周作业(三)WordCount

    这个程序主要就是统计一下文件中的字符数,单词数以及行数. 我的程序很简单,代码很简短,只实现了书中的基本功能. #include <stdio.h> #include <string ...