计算几何/凸包/Floyd


  Orz rausen大爷太强辣

  计算几何题目果然不会做>_>

  这个题……虽然他给了3个坐标,但实际上是个二维的计算几何题= =因为第三维坐标可以直接用前两维坐标表示出来。

  考虑一下这些二维平面上的点的意义……

  假如我们现在手里有一种原材料$(x_1,y_1)$,那么我们就只能搞出这一种合金= =

  那么如果有两种原材料,我们配一配,就可以配出$(x_1,y_1)$到$(x_2,y_2)$这条线段上的所有合金= =

  如果有三种,我们能配出的就是那个三角形区域的所有种类的合金……

  以此类推……我们有n种原材料,我们能搞出的合金就是这n个点的凸包围出来的区域。

  

  所以问题就变成了:从n个点中选出最少的p个点使得给定的m个点全部在这p个点的凸包内(主要意思是这样,当然还有一些边界情况,嗯就是共线、共点……)

  这个是用floyd求最小环来做的……对于每对点(i,j),如果m个点都在向量(i->j)的左边,则连边 i->j 权值为1,那么$ans=min\{dist[i][i]\}$

P.S.好像没有用到求凸包的算法……不过用了凸包的思想……

  1. /**************************************************************
  2. Problem: 1027
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:1172 ms
  7. Memory:2288 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 1027
  11. #include<cmath>
  12. #include<cstdio>
  13. #include<cstring>
  14. #include<cstdlib>
  15. #include<iostream>
  16. #include<algorithm>
  17. #define rep(i,n) for(int i=0;i<n;++i)
  18. #define F(i,j,n) for(int i=j;i<=n;++i)
  19. #define D(i,j,n) for(int i=j;i>=n;--i)
  20. using namespace std;
  21. typedef long long LL;
  22. inline int getint(){
  23. int r=,v=; char ch=getchar();
  24. for(;!isdigit(ch);ch=getchar()) if(ch=='-')r=-;
  25. for(; isdigit(ch);ch=getchar()) v=v*+ch-'';
  26. return r*v;
  27. }
  28. typedef double lf;
  29. const lf eps=1e-;
  30. const int N=,INF=1e9;
  31. /*******************template********************/
  32. int n,m,d[N][N];
  33. struct Point{
  34. double x,y;
  35. Point(){}
  36. Point(lf x,lf y):x(x),y(y){}
  37. void read(){scanf("%lf%lf%*lf",&x,&y);}
  38. inline bool operator != (const Point &p)const{
  39. return fabs(x-p.x) > eps || fabs(y-p.y) > eps;
  40. }
  41. }a[N],b[N];
  42. typedef Point Vector;
  43. Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
  44. lf Cross(Point a,Point b){return a.x*b.y-a.y*b.x;}
  45.  
  46. bool in_one_line(Point x,Point y){
  47. if (x.x > y.x) swap(x,y);
  48. F(i,,m) if (b[i].x < x.x || b[i].x > y.x) return ;
  49. if (x.y > y.y) swap(x,y);
  50. F(i,,m) if (b[i].y < x.y || b[i].y > y.y) return ;
  51. return ;
  52. }
  53. int check(Point x,Point y){
  54. int cnt1=,cnt2=; lf tmp;
  55. F(i,,m){
  56. tmp=Cross(y-x,b[i]-x);
  57. if (tmp>eps) ++cnt1;
  58. if (tmp<-eps) ++cnt2;
  59. if (cnt1 && cnt2) return ;
  60. }
  61. if (!cnt1 && !cnt2 && in_one_line(x,y)){
  62. puts("");
  63. return -;
  64. }
  65. return cnt1 ? : cnt2 ? : ;
  66. }
  67. void Floyd(){
  68. int ans=INF;
  69. F(k,,n) F(i,,n) F(j,,n)
  70. d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
  71. F(i,,n) ans=min(ans,d[i][i]);
  72. if (ans==INF || ans<=) puts("-1");
  73. else printf("%d\n",ans);
  74. }
  75. void solve(){
  76. F(i,,n) F(j,,n) d[i][j]=INF;
  77. F(i,,n) F(j,i+,n){
  78. int f=check(a[i],a[j]);
  79. if (f==-) return;
  80. if (f==) d[i][j]=;
  81. else if (f==) d[j][i]=;
  82. else if (f==) d[i][j]=d[j][i]=;
  83. }
  84. Floyd();
  85. }
  86. bool spj(){
  87. F(i,,n) if (a[]!=a[i]) return ;
  88. F(i,,m) if (a[]!=b[i]) return ;
  89. puts("");
  90. return ;
  91. }
  92. int main(){
  93. n=getint(); m=getint();
  94. F(i,,n) a[i].read();
  95. F(i,,m) b[i].read();
  96. if (spj()) return ;
  97. solve();
  98. return ;
  99. }

1027: [JSOI2007]合金

Time Limit: 4 Sec  Memory Limit: 162 MB
Submit: 2423  Solved: 635
[Submit][Status][Discuss]

Description


公司加工一种由铁、铝、锡组成的合金。他们的工作很简单。首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同。然后,将每种原材料取出一
定量,经过融解、混合,得到新的合金。新的合金的铁铝锡比重为用户所需要的比重。
现在,用户给出了n种他们需要的合金,以及每种合金中铁铝锡的比重。公司希望能够订购最少种类的原材料,并且使用这些原材料可以加工出用户需要的所有种类
的合金。

Input


一行两个整数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),分别表示铁铝锡在一种用户需要的合金中所占的比重。

Output

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

Sample Input

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

Sample Output

5

HINT

Source

[Submit][Status][Discuss]

【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. php 实现多线程

    通过php的Socket方式实现php程序的多线程.php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的.每一个访问者,当访问WEB页面的时候,都将 ...

  2. IOS学习4

    ---恢复内容开始--- UIScrollView 屏幕展示有限,超出一个屏时用户可滚动查看过多部分.UIView不具备滚动功能. -取消autolayout -设置CGSize contentSiz ...

  3. R语言中判断是否是整数。以及读写excel

    今天接手一个重复性工作, 需要手工把产品运营们在excel里写的活动规则, 插入数据库表中.为了减少出错, 提高效率. 再加上最近刚刚学R语言, 就用R练练手, 自动生成mysql的sql语句. 一次 ...

  4. LinearRegressionWithRegularization

    在线性回归的基础上加上正则项: # -*-coding:utf-8 -*- ''' Created on 2016年12月15日 @author: lpworkdstudy ''' import nu ...

  5. 6.css文本样式

    文本样式,只要针对的是文本的效果和文本的方位,即文本样式和文本控制总结起来有一表中的属性可用: 属性名 说明 CSS 版本 text-decoration 装饰文本出现各种划线 1 text-tran ...

  6. [转]Oracle_ProC编程

    1.引言 由于PL/SQL不能用来开发面向普通用户的应用程序,必须借助其他语言或开发工具. 在Linux操作系统下应该用什么语言或开发工具来进行Oracle数据库应用的开发呢?本文将介绍2种方案:Pr ...

  7. spring 基本操作总结主要是aop以及依赖注入的基本配置

    一所需架包 spring commom-logging.jar  spring.jar 注解 common-annotation.jar aop面向切面 aspectjrt.jar    aspect ...

  8. Android中BaseAdapter的基本用法和加载自定义布局!

    public class MainActivity extends Activity { ListView listView = null; @Override protected void onCr ...

  9. 通过store为toolbar添加按钮

    目的是实现导航条toolbar可以动态加载按钮. ExtJS的版本是4.0. 实现方案有两个.方案一:添加render事件监听,在监听事件处理函数中使用Ext.Ajax获取按钮信息,实现动态添加按钮. ...

  10. QT 按钮类继承处理带定时器

    01.class KeyButton : public QPushButton  02.{  03.    Q_OBJECT  04.public:  05.    explicit KeyButto ...