news 2026/11/6 5:02:11

UVa 12816 Isosceles Triangles

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 12816 Isosceles Triangles

摘要:给定平面上NNN个点(N≤100N \le 100N≤100),统计能构成的等腰三角形数量,其中等腰要求恰好两条边相等,等边三角形不计入,三点共线也不构成三角形。由于数据规模很小,三点组合数最多约1.6×1051.6 \times 10^51.6×105,可直接O(N3)O(N^3)O(N3)暴力枚举每个三元组:先用叉积排除共线情况,再用浮点数计算三条边长,借助10−610^{-6}10−6的误差阈值统计三对边中相等的对数,恰好为111时答案加一。

题目描述

给定平面上NNN个点,问这些点能组成多少个等腰三角形。
等腰三角形的定义是:恰好有两条边长度相等。三点共线不能构成三角形。

输入格式

输入包含多组测试用例。
每个测试用例第一行为一个整数NNN(1≤N≤1001 \le N \le 1001≤N≤100),接下来NNN行,每行两个整数Xi,YiX_i, Y_iXi​,Yi​(−100≤Xi,Yi≤100-100 \le X_i, Y_i \le 100−100≤Xi​,Yi​≤100),表示点的坐标。
输入以EOF\texttt{EOF}EOF结束。

输出格式

对于每个测试用例,输出一行一个整数,表示等腰三角形的总数。

样例

输入

6 -4 1 -3 3 -2 1 -2 0 -1 1 1 -1 3 -4 1 -2 1 -1 1

输出

4 0

题目分析

本题数据规模很小,N≤100N \le 100N≤100,所有三点组合数为(1003)=161700\binom{100}{3} = 161700(3100​)=161700,完全可以在O(N3)O(N^3)O(N3)时间内暴力枚举每个三元组并判定。

对于任意三个点,首先需要判断它们是否共线。若共线则面积为000,不能构成三角形。共线判定可使用叉积:
设三点为A(x1,y1)A(x_1,y_1)A(x1​,y1​),B(x2,y2)B(x_2,y_2)B(x2​,y2​),C(x3,y3)C(x_3,y_3)C(x3​,y3​),则叉积
cross=(x2−x1)(y3−y1)−(y2−y1)(x3−x1) \textit{cross} = (x_2 - x_1)(y_3 - y_1) - (y_2 - y_1)(x_3 - x_1)cross=(x2​−x1​)(y3​−y1​)−(y2​−y1​)(x3​−x1​)
若∣cross∣<10−6|\textit{cross}| < 10^{-6}∣cross∣<10−6,则认为三点共线。

若不共线,则计算三条边的长度(欧氏距离),使用浮点数double\texttt{double}double存储。
等腰三角形的判定标准是:恰好有两边长度相等。注意等边三角形(三边相等)不符合题意,因为等腰要求“恰好”两条边相等。因此,我们需要统计三对长度比较中相等的对数。若相等对数为111,则三角形是等腰非等边,计数加一。

由于坐标都是整数,边长可能为无理数,因此比较时需要允许误差。题目要求两个长度La,LbL_a, L_bLa​,Lb​视为相等当且仅当∣La−Lb∣<10−6|L_a - L_b| < 10^{-6}∣La​−Lb​∣<10−6。

解题思路

直接枚举所有三元组(i,j,k)(i, j, k)(i,j,k),其中i<j<ki < j < ki<j<k,对每个三元组执行以下步骤:

  1. 计算叉积cross\textit{cross}cross,若∣cross∣<ϵ|\textit{cross}| < \epsilon∣cross∣<ϵ,则三点共线,跳过。
  2. 计算三条边长d12,d13,d23d_{12}, d_{13}, d_{23}d12​,d13​,d23​。
  3. 统计三对长度比较中相等的次数:
    • 若∣d12−d13∣<ϵ|d_{12} - d_{13}| < \epsilon∣d12​−d13​∣<ϵ,相等计数加一;
    • 若∣d12−d23∣<ϵ|d_{12} - d_{23}| < \epsilon∣d12​−d23​∣<ϵ,相等计数加一;
    • 若∣d13−d23∣<ϵ|d_{13} - d_{23}| < \epsilon∣d13​−d23​∣<ϵ,相等计数加一。
  4. 若相等计数恰好为111,则说明该三角形有且仅有一对边相等,即恰有两边相等,答案加一。

该方法的时间复杂度为O(N3)O(N^3)O(N3),对于N=100N=100N=100完全可行,空间复杂度O(N)O(N)O(N)存储点集。

代码实现

// Isosceles Triangles// UVa ID: 1816// Verdict: Accepted// Submission Date: 2026-07-13// UVa Run Time: 0.010s//// 版权所有(C)2026,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structPoint{doublex,y;};doubledist(constPoint&a,constPoint&b){doubledx=a.x-b.x,dy=a.y-b.y;returnsqrt(dx*dx+dy*dy);}intmain(){intN;while(scanf("%d",&N)==1){vector<Point>pts(N);for(inti=0;i<N;++i)scanf("%lf %lf",&pts[i].x,&pts[i].y);intans=0;constdoubleEPS=1e-6;for(inti=0;i<N;++i)for(intj=i+1;j<N;++j)for(intk=j+1;k<N;++k){// 叉积判断共线doublecross=(pts[j].x-pts[i].x)*(pts[k].y-pts[i].y)-(pts[j].y-pts[i].y)*(pts[k].x-pts[i].x);if(fabs(cross)<EPS)continue;doubled12=dist(pts[i],pts[j]);doubled13=dist(pts[i],pts[k]);doubled23=dist(pts[j],pts[k]);inteq=0;if(fabs(d12-d13)<EPS)++eq;if(fabs(d12-d23)<EPS)++eq;if(fabs(d13-d23)<EPS)++eq;if(eq==1)++ans;}printf("%d\n",ans);}return0;}

总结

本题是一道经典的几何计数问题,由于数据规模小,暴力枚举所有三点组合是最高效且最直接的做法。关键点在于:

  • 利用叉积排除共线情况;
  • 使用浮点数及误差阈值比较边长,避免精度问题;
  • 严格区分等腰三角形(恰好一对等边)与等边三角形(三边相等),只统计相等对数为111的情况。

该解法思路清晰,代码简洁,时间复杂度O(N3)O(N^3)O(N3)足以应对N=100N=100N=100的限制。在实际比赛中,此类小数据题目应优先考虑暴力枚举,确保正确性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 5:01:41

3 条命令免费跑起来:开源 UI 原型工具 Pencil Project 入门

3 条命令免费跑起来&#xff1a;开源 UI 原型工具 Pencil Project 入门 【免费下载链接】pencil The Pencil Projects unique mission is to build a free and opensource tool for making diagrams and GUI prototyping that everyone can use. 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/11/6 4:56:12

drawio-desktop 完整指南:离线免费画流程图与架构图

drawio-desktop 完整指南&#xff1a;离线免费画流程图与架构图 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop drawio-desktop 是 draw.io 官方桌面版&#xff0c;把核心编辑器…

作者头像 李华
网站建设 2026/11/6 4:51:41

Visual Studio Code 配置 java/maven 环境(Windows版)

1. 安装 JDK 进入Oracle官网下载jdk&#xff0c;本文已jdk8为主 官网下载地址&#xff1a;Java Downloads | Oracle 配置系统环境变量&#xff1a; 1) JAVA_HOME 创建系统环境变量 JAVA_HOME, 赋值为 jdk安装路径 (Maven 由 Java 开发&#xff0c;执行时需用到环境变量 JAVA_…

作者头像 李华
网站建设 2026/11/6 4:49:10

Spring配置补充 (随笔详情扩展:)

Spring配置补充&#xff1a; 实现Spring 和 MyBatis 集成过程中学习了,Spring 的配置数据源的方法; 实际开发过程中还有很多灵活的配置文件; 灵活配置DataSource: <!-- 远古方法&#xff08;最初方法&#xff09;,数据库连接池,不过我最喜欢用的; --><bean id"…

作者头像 李华
网站建设 2026/11/6 4:45:57

EtherCAT芯片方案选型:嵌入式接口与网关集成路径全面对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华