问题描述

给你 n 个三角形,每个三角形有一个优雅值,
然后给出一个询问,每次询问一个三角形,
求与询问的三角形,相似的三角形中的优雅值最大是多少。

★数据输入
第一行输入包括 n 一个数字,
接下来 n 行,每行四个整数数字
a,b,c,val 表示三条边,以及优美值
之后输入一个数字 m
之后 m 行,每行三个数字 a,b,c,表示询问的三角形。

★数据输出
输出 m 行,如果查询的三角形不在给定的 n 个中,输出”Sorry”,否则输出三角
形的优美值

  输入

    3
    3 5 4 10
    6 8 10 20
    2 3 4 5
    3
    3 4 5
    4 5 6
    2 3 4

  输出

    20
    Sorry
    5

★提示

给出的三条边无序,且保证可以构成三角形
40%数据
不需要考虑相似条件
70%的数据
1<=n,m<=1,000
1<=a,b,c<=1,000
100%的数据
1<=n<=200,000 1<=m<=500,000
a,b,c(1<=a,b,c<=100,000)
val 在 int 范围内

思路

  哈希散列

  对三角形相似的判断

    对三角形的三边abc排序,a最小,c最大

    任取两边相除得到两个比值 1.0*a/b,1.0*a/c,若两个三角形对应比值相等,那么这两个三角形相似

  哈希值的计算

    极限的数据会出现类似 1.0*100000/99999 与1.0*99999/99998这样的情况,要精确的小数点后10为才能比较

    以下是我的哈希值求法(或许有更优的做法,能散的更开,更平均,求告知

       double f = (1.0*a / b + 1.0*a / c);
      __int64 i64 = f * 1000000000;
      return i64 % MAXN;

  数据的存储

    #define MAXN 100001  //开多少视情况而定

    开MAXN长度的指针数组,每个元素都是一个链表表头

    用三角形求出的哈希值就是数组的下标,(注意,不相似的三角形可能有相同的哈希值)

    遍历对应链表,若找到边比例比例与当前的相等(相似),而权值比较小的,就用当前的较大权值替换之

          若找到边比例比例与当前的相等,而权值比当前大,break掉,不存储当前值

          若未找到,则在链表后新加一个

  查找同理,算哈希值,遍历链表

  

  试着用map写了一下,最后3个点RE。。。。。。

  还是不能偷懒啊

code

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. #define MAXN 100001
  7.  
  8. struct Triangle
  9. {
  10. Triangle(double &_rate12, double &_rate13, int &_weight)
  11. :rate12(_rate12), rate13(_rate13), weight(_weight),next(NULL) {}
  12. double rate12;
  13. double rate13;
  14. int weight;
  15. Triangle *next;
  16. };
  17.  
  18. Triangle *arr[MAXN];
  19.  
  20. inline int calcHash(int &a, int &b, int &c)
  21. {
  22. double f = (1.0*a / b + 1.0*a / c);
  23. __int64 i64 = f * ;
  24. return i64 % MAXN;
  25. }
  26.  
  27. inline void sort3(int &a,int &b,int &c)//1 2 3 (from min to max)
  28. {
  29. if (a > b) { a ^= b; b ^= a; a ^= b; }
  30. if (b > c) { c ^= b; b ^= c; c ^= b; }
  31. if (a > b) { a ^= b; b ^= a; a ^= b; }
  32. }
  33.  
  34. int main()
  35. {
  36. //freopen("test.txt", "r", stdin);
  37. //freopen("out.txt","w",stdout);
  38. int i, j;
  39. int n, m;
  40. int a, b, c, w;
  41. scanf("%d", &n);
  42.  
  43. for (i = ; i < n; i++)
  44. {
  45. scanf("%d %d %d %d", &a, &b, &c, &w);
  46. sort3(a, b, c);
  47. int index = calcHash(a, b, c);
  48. double rate12 = 1.0*a / b;
  49. double rate13 = 1.0*a / c;
  50. Triangle *p = arr[index];
  51. if (p==NULL)
  52. {
  53. arr[index] = new Triangle(rate12, rate13, w);
  54. }
  55. else
  56. {
  57. Triangle * tail = p;
  58. bool found = false;
  59. while (p)
  60. {
  61. if (rate12 == p->rate12 && rate13 == p->rate13)
  62. {
  63. if(w > p->weight)
  64. p->weight = w;
  65. found = true;
  66. break;
  67. }
  68. else
  69. {
  70. tail = p;
  71. p = p->next;
  72. }
  73. }
  74. if (!found)
  75. {
  76. tail->next = new Triangle(rate12, rate13, w);
  77. }
  78. }
  79.  
  80. }
  81.  
  82. scanf("%d", &m);
  83. for (i = ; i < m; i++)
  84. {
  85. scanf("%d %d %d", &a, &b, &c);
  86. sort3(a, b, c);
  87. int index = calcHash(a, b, c);
  88. double rate12 = 1.0*a / b;
  89. double rate13 = 1.0*a / c;
  90. Triangle *p = arr[index];
  91. bool found = false;
  92. while (p)
  93. {
  94. if (rate12 == p->rate12 && rate13 == p->rate13)
  95. {
  96. found = true;
  97. printf("%d\n", p->weight);
  98. break;
  99. }
  100. else
  101. p = p->next;
  102. }
  103. if (!found) printf("Sorry\n");
  104. }
  105.  
  106. return ;
  107. }

数据结构_相似三角形优雅值_sjx的更多相关文章

  1. 三角形的优雅值(map和哈希表)

    给你 n 个三角形,每个三角形有一个优雅值,然后给出一个询问,每次询问一个三角形,求与询问的三角形,相似的三角形中的优雅值最大是多少.★数据输入第一行输入包括 n 一个数字,接下来 n 行,每行四个整 ...

  2. 数据结构_find_lucky_number(寻找幸运值)

    数据结构_find_lucky_number(寻找幸运值) 问题描述 给出两个已按升序排列的数组 a[1..n],b[1..m],如果存在 i,j,使得a[i]+b[j]==k,我们便说已找到幸运值. ...

  3. cb41a_c++_STL_算法_填充新值fill_generate

    cb41a_c++_STL_算法_填充新值fill_generatefill(b,e,v)fill_n(b,n,v),填充n个vgenerate(b,e,p)generate_n(b,n,p) gen ...

  4. cb03a_c++_数据结构_顺序容器_STL_stack

    /*cb03a_c++_数据结构_顺序容器_STL_stack堆栈:LIFO--Last In First Out后进先出,用于系统程序设计自适应容器(容器适配器),不是独立的容器,是一个适配器栈适配 ...

  5. cb02a_c++_数据结构_顺序容器_STL_list类_双向链表

    /*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...

  6. cb01a_c++_数据结构_顺序容器_STL_deque类

    /*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...

  7. java数据结构_笔记(4)_图

    图一.概念.图: 是一种复杂的非线性数据结构.图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为:G=(V, E)  其中: V 是顶点的有穷非空集合,E 是 V 中顶点偶对(称为边)的有穷 ...

  8. C#数据结构_基本概念及线性表

    常见的4类数据结构: 1.集合. 2.线性结构.3.树形结构.4.图状结构. 数据结构(Data Structure)简记为 DS,是一个二元组,DS = (D,R) 其中:D 是数据元素的有限集合, ...

  9. Python 数据结构_堆栈

    目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...

随机推荐

  1. 浅学soap--------1

    无wsdl文件: Clint.php //客户端 <?php $soap = new SoapClient(null,array('uri'=>'server','location'=&g ...

  2. mysql Replication机制

      从上图可以看见MySQL 复制的基本过程如下: Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容: Master 接收到来自 Sl ...

  3. redhat5.8 alt+ctrl+f1 黑屏

    /********************************************************************** * redhat5.8 alt+ctrl+f1 黑屏 * ...

  4. 从零开始的acm竞赛生涯

    经过了一段时间的训练,自己的成绩还是很不理想.回首过往,感觉自己还是练得太少,一直没有进入状态,缺乏硬怼出题的能力,思维也不够快,赛场上各种被卡题.可以说,我之前的训练有些仓促,还没有达到入门的水准, ...

  5. C#进阶之路(四):拉姆达

    对于拉姆达,许多文章都讲过原理及如何使用,所以这篇文章我主要是摘录我学习过的文字,总结下我自己的学习心得. 什么是拉姆达表达式 "Lambda表达式"是一个匿名函数,是一种高效的类 ...

  6. java 连接oracle数据库

    package shujuku; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  7. AMD 规范

    AMD(异步模块定义)是为浏览器环境设计的,因为 CommonJS 模块系统是同步加载的,当前浏览器环境还没有准备好同步加载模块的条件. AMD 定义了一套 JavaScript 模块依赖异步加载标准 ...

  8. 在centos阿里云服务器上安装配置php运行环境 安装php7

    http://blog.csdn.net/kesixin/article/details/72882469 单独安装php7 http://blog.csdn.net/tang05709/articl ...

  9. Azure上采用Json Template从已有的VHD创建VM

    从已有的VHD创建VM是使用Azure中经常要操作的内容. 本文将介绍如何采用Json Template从已经有的VHD创建VM. 一.准备VHD 在我的Azure账户中选择一台VM,如下图: 查看其 ...

  10. 上传文件csv 导入功能

    HTML代码: <script> function uploadCsv() { $('#chooseCsvFile').click(); } function doUploadCsv() ...