题解就看这位仁兄的吧…不过代码还是别看他的了…

同样的方法…我200ms,他2000ms.

常数的幽怨…

CODE

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 505;
  4. const double eps = 1e-8;
  5. struct Point {
  6. double x, y;
  7. Point(){}
  8. Point(double x, double y):x(x), y(y){}
  9. inline Point operator -(const Point &o)const { return Point(x-o.x, y-o.y); }
  10. inline double operator *(const Point &o)const { return x*o.y - y*o.x; }
  11. }a[MAXN], b[MAXN];
  12. struct Line {
  13. Point p, v;
  14. Line(){}
  15. Line(const Point &p, const Point &v):p(p), v(v){}
  16. };
  17. inline bool On_Right(const Line &l, const Point &p) {
  18. return (p - l.p) * l.v > eps;
  19. }
  20. inline int dcmp(const double &x) {
  21. return x < -eps ? -1 : x < eps ? 0 : 1;
  22. }
  23. int m, n, f[MAXN][MAXN];
  24. int main () {
  25. scanf("%d%d", &m, &n); double o;
  26. for(int i = 1; i <= m; ++i) scanf("%lf%lf%lf", &a[i].x, &a[i].y, &o);
  27. for(int i = 1; i <= n; ++i) scanf("%lf%lf%lf", &b[i].x, &b[i].y, &o);
  28. for(int i = 1; i <= m; ++i) {
  29. for(int j = 1; j <= m; ++j)
  30. f[i][j] = m+1;
  31. bool flg = 1;
  32. for(int j = 1; j <= n && flg; ++j)
  33. if(dcmp(b[j].x-a[i].x) || dcmp(b[j].y-a[i].y)) flg = 0;
  34. if(flg) return puts("1"), 0;
  35. }
  36. for(int i = 1; i <= m; ++i)
  37. for(int j = 1; j <= m; ++j)
  38. if(i != j && !(a[i].x == a[j].x && a[i].y == a[j].y)) { //i->j
  39. Line tmp = Line(a[i], a[j] - a[i]);
  40. bool flg = 1;
  41. for(int k = 1; k <= n && flg; ++k)
  42. if(On_Right(tmp, b[k])) flg = 0;
  43. if(flg) {
  44. for(int k = 1; k <= n && flg; ++k)
  45. if
  46. (
  47. (!dcmp((b[k] - tmp.p) * tmp.v))
  48. &&
  49. ((b[k].x < a[i].x && b[k].x < a[j].x)
  50. || (b[k].x > a[i].x && b[k].x > a[j].x)
  51. || (b[k].y < a[i].y && b[k].y < a[j].y)
  52. || (b[k].y > a[i].y && b[k].y > a[j].y)
  53. )
  54. ) flg = 0;
  55. if(flg) f[i][j] = 1;
  56. }
  57. }
  58. for(int k = 1; k <= m; ++k)
  59. for(int i = 1; i <= m; ++i) if(f[i][k] <= m)
  60. for(int j = 1; j <= m; ++j) if(f[k][j]+f[i][k] <= m)
  61. f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
  62. int ans = m+1;
  63. for(int i = 1; i <= m; ans = min(ans, f[i][i]), ++i);
  64. printf("%d\n", ans > m ? -1 : ans);
  65. }

BZOJ 1027: [JSOI2007]合金 (计算几何+Floyd求最小环)的更多相关文章

  1. BZOJ 1027 JSOI2007 合金 计算几何+Floyd

    题目大意:给定一些合金,选择最少的合金,使这些合金能够按比例合成要求的合金 首先这题的想法特别奇异 看这题干怎么会想到计算几何 并且计算几何又怎么会跟Floyd挂边 好强大 首先因为a+b+c=1 所 ...

  2. 【BZOJ 1027】 (凸包+floyd求最小环)

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

  3. BZOJ 1027 [JSOI2007]合金 ——计算几何

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

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

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

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

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

  6. bzoj 1027: [JSOI2007]合金【凸包+Floyd】

    参考:https://www.cnblogs.com/zhuohan123/p/3237246.html 因为一c可以由1-a-b得出,所以删掉c,把a,b抽象成二维平面上的点.首先考虑一个客户需求能 ...

  7. BZOJ 1027 [JSOI2007]合金

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

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

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

  9. 1027: [JSOI2007]合金 - BZOJ

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

随机推荐

  1. poj1696(极角排序,贪心)

    ---恢复内容开始--- 题目链接:https://vjudge.net/problem/POJ-1696 题意:有n个点,规定起点,每次只能向左走,不能与之前的路径交叉,求最多能经过几个点. 思路: ...

  2. Spring mybatis源码篇章-Mybatis的XML文件加载

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis主文件加载 前话 前文主要讲解了Mybatis的主文件加载方式,本文则分析不使用主文件加载方式 ...

  3. docker login Harbor时报错403 Forbidden

    背景 在本地搭建了harbor后,在进行了相关配置后,还是报错:Error response from daemon: login attempt to http://10.xx.xx.xx:8000 ...

  4. Redis提供的持久化机制

    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...

  5. java基础知识入门

    一.java简介及原理图 Java的前世今生 Java之父詹姆斯·高斯林: 1967年, 12岁用报废的电话机和电视做了一台电子游戏机; 1983年, 获得卡内基梅隆大学计算机科学博士学位; 1983 ...

  6. TypeScript 解构

    ⒈解构数组 最简单的解构莫过于数组的解构赋值了: let input = [1, 2]; let [first, second] = input; console.log(first); // out ...

  7. 20190805-Python基础 第二章 列表和元组(2)列表

    1. list函数,用于将字符串转换为列表 2. 基本的列表操作 修改列表 - 给元素赋值,使用索引表示法给特定的元素赋值,如x[1] = 2 删除元素 - 使用del语句即可 name1 = ['a ...

  8. 【第一季】CH09_FPGA多路分频器设计

    [第一季]CH09_FPGA多路分频器设计 在第七节的学习中,笔者带大家通过一个入门必学的流水灯实验实现,快速掌握了VIVADO基于FPGA开发板的基本流程.考虑到很多初学者并没有掌握好Vivado ...

  9. 8-MySQL DBA笔记-测试基础

    第三部分 测试篇 测试需要掌握的知识面很广泛,本篇的关注点是数据库的性能测试和压力测试,对于其他领域的测试,由于涉猎不多,笔者就不做叙述了.DBA的工作职责之一就是评估软硬件,这往往是一项很耗时的工作 ...

  10. C# DataTable根据字段排序

    DataTable dt = new DataTable(); dt.Columns.Add("Name"); dt.Columns.Add("Age");// ...