三角形的优雅值(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 每次只能删除单个域,如果你需要在一 ...
随机推荐
- Ubuntu下SSH无密码验证配置
前言 SSH为Secure Shell 的缩写,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.越来越多的小伙伴们使用远程登录,而ssh安全性无疑是很高的,那么我们现在来看看如何实现ss ...
- Python 读、写、追加csv文件详细以及注意事项
一.利用csv库创建文件 首先导入csv文件 import csv 根据指定的path创建文件: def create_csv(path): with open(path, "w+" ...
- 还有看不懂的java语句?
Person stuProxy= (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[] ...
- 【openstack N版】——网络服务neutron(flat扁平网络)
一.openstack网络服务neutron 1.1neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目,早期的时候是没有neutron,早期所使用的 ...
- Android开发实战(申明:来源于网络)
Android开发实战(申明:来源于网络) 地址:http://so.csdn.net/so/search/s.do?q=Android%E5%BC%80%E5%8F%91%E5%AE%9E%E6%8 ...
- keil 生成 bin文件
D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o $L@L.bin #L 这个就是keil的默认安装路径
- python 过滤掉字符串中的回车符与换行符(\t\n)
我们在文本数据预处理前,要将数据统一整理成需要的格式,其中有回车(\t)或者(\n)符号,会对我们的数据保存有影响,那么就需要将其过滤掉. 比较简单的方法,用replace()将这些符号替换为空,一定 ...
- 利用Python的collections包下Counter的类统计每个数据出现的个数
from collections import Counter a = [1, 2, 3, 1, 1, 2] result = Counter(a) print result 输出: {1: 3, 2 ...
- H. GSS and Simple Math Problem 高精度乘法模板
链接:https://www.nowcoder.com/acm/contest/104/G来源:牛客网 题目描述 Given n positive integers , your task is to ...
- 网络层block,delegate之优劣分析
正常情况下, block 缺点: 1.block很难追踪,难以维护 2.block会延长先关对象的生命周期 block会给内部所有的对象引用计数+1, 一方面会带来潜在的循环引用(retain cyc ...