【题目链接】: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的情况。

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

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

没办法用闭包涉及到。

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

(很懒并没有加上)

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



【完整代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define rei(x) scanf("%d",&x)
  13. #define rel(x) scanf("%lld",&x)
  14. #define ref(x) scanf("%lf",&x)
  15. typedef pair<int, int> pii;
  16. typedef pair<LL, LL> pll;
  17. const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
  18. const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
  19. const double pi = acos(-1.0);
  20. const int N = 510;
  21. const int INF = 0x3f3f3f3f;
  22. struct point
  23. {
  24. double x, y;
  25. point operator -(const point z)
  26. {
  27. point re;
  28. re.x = x - z.x;
  29. re.y = y - z.y;
  30. return re;
  31. }
  32. double operator * (const point z)
  33. {
  34. return x*z.y - y*z.x;
  35. }
  36. double operator ^ (const point z)
  37. {
  38. return x*z.x + y*z.y;
  39. }
  40. } a[N], b[N];
  41. int m, n;
  42. int d[N][N], f[N][N];
  43. int ans = INF;
  44. void input_data()
  45. {
  46. rei(m), rei(n);
  47. double t;
  48. rep1(i, 1, m)
  49. {
  50. ref(a[i].x), ref(a[i].y), ref(t);
  51. }
  52. rep1(i, 1, n)
  53. {
  54. ref(b[i].x), ref(b[i].y), ref(t);
  55. }
  56. }
  57. void ga()
  58. {
  59. memset(d, 0x3f, sizeof d);
  60. rep1(i,1,m)
  61. rep1(j, 1, m)
  62. {
  63. int k;
  64. for (k = 1; k <= n;k++)
  65. {
  66. double cross = (a[i] - b[k])*(a[j] - b[k]);
  67. if (cross > 1e-7)
  68. break;
  69. if (fabs(cross) < 1e-7 && (a[i] - b[k] ^ a[j] - b[k]) > 1e-7)
  70. break;
  71. }
  72. if (k == n + 1)
  73. d[i][j] = 1;
  74. }
  75. }
  76. void fl()
  77. {
  78. memcpy(f, d, sizeof f);
  79. rep1(k,1,m)
  80. rep1(i,1,m)
  81. if (f[i][k]<INF)
  82. rep1(j, 1, m)
  83. {
  84. f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
  85. }
  86. rep1(i, 1, m)
  87. ans = min(ans, f[i][i]);
  88. }
  89. void o()
  90. {
  91. if (ans == INF)
  92. {
  93. puts("-1");
  94. return;
  95. }
  96. printf("%d\n", ans);
  97. }
  98. int main()
  99. {
  100. //freopen("F:\\rush.txt", "r", stdin);
  101. input_data();
  102. ga();
  103. fl();
  104. o();
  105. //printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
  106. return 0;
  107. }

【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. 忍者无敌-实例解说Cocos2d-x瓦片地图

    实例比較简单,如图所看到的,地图上有一个忍者精灵,玩家点击他周围的上.下.左.右,他能够向这个方向行走. 当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包含了:树.山.河流等. 忍者实例地图 ...

  2. [Angular] Implement a custom form component by using control value accessor

    We have a form component: <label> <h3>Type</h3> <workout-type formControlName=& ...

  3. HttpClient FormUrlEncodedContent System.UriFormatException: 无效的 URI: URI 字符串太长问题解决方案

    1.问题描述: HttpClint 使用FormUrlEncodedContent 调用接口时 报错 System.UriFormatException: 无效的 URI: URI 字符串太长: 2. ...

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

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

  5. JDBC 专题

    digest: getFetchSize()方法不是获得记录数,而是获得每次抓取的记录数,默认是0,也就是说不限制.可以用setFetchSize()来设置,而getFetchSize()是用来读出那 ...

  6. DIV+CSS学习笔记

    第十五章 定位 static静态定位(不对它的位置进行改变,在哪里就在那里) 默认值.没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明 ...

  7. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...

  8. [D3] Build a Column Chart with D3 v4

    Column and bar charts are staples of every visualization library. They also make a great project for ...

  9. iTestin云测工具

    软件概述 iTestin是免费服务移动App开发者的真机自动化云测试客户端工具.基于真实的智能终端设备录制一个测试脚本然后运行,并输出运行结果.覆盖Android和iOS两大设备平台,支持Pad/Ph ...

  10. ios sqlite数据库操作

    @interface MyViewController () { // 数据库实例,代表着整个数据库 sqlite3 *_db; } @end @implementation MyViewContro ...