三角形的优雅值(map和哈希表)
给你 n 个三角形,每个三角形有一个优雅值,
然后给出一个询问,每次询问一个三角形,
求与询问的三角形,相似的三角形中的优雅值最大是多少。
★数据输入
第一行输入包括 n 一个数字,
接下来 n 行,每行四个整数数字
a,b,c,val 表示三条边,以及优美值
之后输入一个数字 m
之后 m 行,每行三个数字 a,b,c,表示询问的三角形。
★数据输出
输出 m 行,如果查询的三角形不在给定的 n 个中,输出”Sorry”,否则输出三角
形的优美值
| 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 范围内
知识1:相似三角形的判断: 将其都化成最小的整数相似三角形,如6,8,10化为3,4,5
解法一:用map,搜索比hash表慢
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <string>
using namespace std;
map<__int64,int> mp;
int gcd(int a,int b)
{
if(b==) return a;
else return gcd(b,a%b);
}
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int main()
{
int n,m,a[],val,i,t,k,hash;
scanf("%d",&n);
mp.clear();
for(i=;i<n;i++)
{
scanf("%d %d %d %d",&a[],&a[],&a[],&val);
k = gcd(a[],gcd(a[],a[]));
a[]/=k;a[]/=k;a[]/=k;
sort(a,a+);
hash = (a[]* +a[])* + a[];
if(mp.find(hash) != mp.end())
mp[hash] = max(mp[hash],val);
else
mp[hash] = val;
}
scanf("%d",&m);
for(i=;i<m;i++)
{
scanf("%d %d %d",&a[],&a[],&a[]);
k = gcd(a[],gcd(a[],a[]));
a[]/=k;a[]/=k;a[]/=k;
sort(a,a+);
hash = (a[]* +a[])* + a[];
if(mp.find(hash) != mp.end())
printf("%d\n",mp[hash]);
else
printf("Sorry\n");
}
return ;
}
解法2:用hash表做
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <string>
using namespace std;
struct Node {
__int64 hash;
int val;
}tri[]; int gcd(int a,int b)
{
return b ? gcd(b, a % b) : a;
}
bool cmp(Node a, Node b)
{
if (a.hash != b.hash) return a.hash < b.hash;
else return a.val > b.val; //hash值相等时按val值排序
}
int Lower_bound(Node *array, int size, int key)
{
int first = , middle;
int half, len;
len = size; while(len > ) {
half = len >> ;
middle = first + half;
if(tri[middle].hash < key) {
first = middle + ;
len = len-half-; //在右边子序列中查找
}
else
len = half; //在左边子序列(包含middle)中查找
}
return first;
}
int main()
{
int n,m,a[],val,i,t,k;
__int64 hash;
scanf("%d",&n);
//mp.clear();
for(i=;i<n;i++)
{
scanf("%d %d %d %d",&a[],&a[],&a[],&val);
k = gcd(a[],gcd(a[],a[]));
a[]/=k;a[]/=k;a[]/=k;
sort(a,a+);
hash = (a[]* +a[])* + a[];
tri[i].hash = hash;
tri[i].val = val;
}
sort(tri,tri+n,cmp);
scanf("%d",&m);
for(i=;i<m;i++)
{
scanf("%d %d %d",&a[],&a[],&a[]);
k = gcd(a[],gcd(a[],a[]));
a[]/=k;a[]/=k;a[]/=k;
sort(a,a+);
hash = (a[]* +a[])* + a[];
int pos = Lower_bound(tri,n,hash);
if (pos == n || tri[pos].hash != hash) puts("Sorry");
else printf("%d\n", tri[pos].val);
}
return ;
}
三角形的优雅值(map和哈希表)的更多相关文章
- [CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map
13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the numbe ...
- Map - leetcode [哈希表]
149. Max Points on a Line unordered_map<float, int> hash 记录的是斜率对应的点数 unordered_map<float, i ...
- 哈希表(散列表)—Hash表解决地址冲突 C语言实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...
- [转]net中哈希表的使用 Hashtable
本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...
- 哈希表(Hashtable)简述
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...
- 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)
链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...
- C# 通俗说 哈希表
1.何谓哈希 哈希,也程散列.哈希表是一种与数组,链表等不同的数据结构,与他们需要不断的 遍历比较查找的办法,哈希表设计了一个映射关系发f(key)=adress,根据key来计算adress, 这样 ...
- Redis哈希表总结
本文及后续文章,Redis版本均是v3.2.8 在文章<Redis 数据结构之dict><Redis 数据结构之dict(2)>中,从代码层面做了简单理解.总感觉思路的不够条理 ...
- Redis常用操作-------Hash(哈希表)
1.HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一 ...
随机推荐
- 解决在antd中使用 autoprefixer 9.4.5 会抛出错误 Replace text-decoration-skip: ink to text-decoration-skip-ink: auto, because spec had been changed 的问题
其实这个和antd的版本有关系,只需要把antd的版本升级到3.12.4就可以了 yarn add antd@ --save 记得重新运行一下项目
- OpenGL——圆公式相关变化的绘制
#include<iostream> #include <math.h> //旧版本 固定管线 #include<Windows.h> #include <G ...
- puppt服务资源管理
1.服务资源的特性 controllable 提供变量控制 enableable 可以启动 停止服务 refreshable 可以重启服务 2.可用参数: ensure ...
- [转]复制、移动和删除:cp, rm, mv
转自:http://www.cnblogs.com/benio/archive/2010/07/27/1785929.html 要复制文件,请使用cp(copy)命令.不过,cp命令的用途很多.除了单 ...
- IIS 6的日志time-taken字段没有值的解决方案
1.IIS 6网站的活动日志格式选择“W3C 扩展日志文件格式”. 2.日志记录属性的高级选项卡,扩展属性列表勾选time-taken.
- Django之MVC框架与MTV框架详解
Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...
- 导入Excel 类型的数据
thinkphp 访问此控制方法就可以导入了 //数据导入 public function impUser(){ if (!empty($_FILES)) { $upload = new \Think ...
- -----------MSSQL生成流水号-----------------------
--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号.--得到新编号的函数CREATE FUNCTION f_NextBH()RETURNS char(8)ASBEGIN RETURN( ...
- jexus手动跨域设置
AP.NET MVC默认跨域方法如下: <system.webServer> <validation validateIntegratedModeConfiguration=&quo ...
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...