版权声明:未经本人同意,禁止转载。 https://blog.csdn.net/qq_34022601/article/details/84147502
算法与数据结构实验题 9.1
★实验任务
给定 n 个三角形,用 a,b,c 表示三角形的三条边(三角形可能有重复)。之后有 m 次询问,每次询问一个三角形在给定的 n 个三角形中出现的次数。
★数据输入
第一行为 n,之后 n 行,每行有 a,b,c 三个数字表示三角形的三条边;接下来一行为 m,之后有 m 行询问,每行有 a,b,c 三个数字,表示要询问的三角形的三边。
数据保证 a,b,c 为正整数且可以构成一个三角形,且 a,b,c 不一定有序对于 40%的数据,n<=100,m<=100,a,b,c<=100
对于 70%的数据,n<=1000,m<=1000,a,b,c<=1000
对于 100%的数据,n<=5,000,m<=100,000,a,b,c<=999999
★数据输出
对于每次询问,输出此三角形在之前给定的 n 个三角形中出现的次数
输入示例 |
输出示例 |
3 2 2 3 3 3 4 2 3 2 3 2 3 2 3 3 4 1 1 1 |
2 1 0 |
★提示
整数 Hash、字符串 Hash
这道题有多种解法.
1.三角形三边长作为hash对象,hash=a*1e6+b*1e6+c;
2. 直接pair<a,pair<b,c>> 利用pair嵌套,放入map进行hash.
3.对题目特殊处理化,三边整数a,b,c.周长a+b+c;面积 :海伦公式;pair<int ,double> ,放入map ,hash。
3.
/*
Date: 17/11/18 00:24
Description:
80 ms/5172 kb
*/
#include <cstdio>
#include <map>
#include <cmath>
using namespace std;
map <pair<int,double>,int > mp;
int main()
{
double a,b,c,s;
int n,m,sum;
scanf ("%d",&n);
pair <int,double> p;
while (n--)
{
scanf ("%lf %lf %lf",&a,&b,&c);
sum=a+b+c;
s=sqrt(sum/2.0*1.0*(sum/2.0-a)*(sum/2.0-b)*(sum/2.0-c));
p.first=sum;
p.second=s;
mp[p]++;
}
scanf ("%d",&m);
while (m--)
{
scanf ("%lf %lf %lf",&a,&b,&c);
sum=a+b+c;
s=sqrt(sum/2.0*1.0*(sum/2.0-a)*(sum/2.0-b)*(sum/2.0-c));
p.first=sum;p.second=s;
printf ("%d\n",mp[p]);
}
return 0;
}