题目描述
有N条线段,长度分别为a[1]-a[n]。
现要求你计算这N条线段最多可以组合成几个直角三角形。每条线段只能使用一次,每个三角形包含三条线段。
输入描述
第一行输入一个正整数T(1<=T<=100),表示有T组测试数据.对于每组测试数据,接下来有T行,
每行第一个正整数N,表示线段个数(3<=N<=20),接着是N个正整数,表示每条线段长度,(0<a[]<100)。
输出描述
对于每组测试数据输出一行,每行包括一个整数,表示最多能组合的直角三角形个数
用例
输入
1
7 3 4 5 6 5 12 13
输出
2
说明
可以组成2个直角三角形(3,4,5)、(5,12,13)
代码
Java
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
for (int t = 0; t < T; t++) {
int N = scanner.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = scanner.nextInt();
}
Arrays.sort(arr);
Set<String> triangles = new HashSet<>();
int count = 0;
for (int i = 0; i < N - 2; i++) {
for (int j = i + 1; j < N - 1; j++) {
for (int k = j + 1; k < N; k++) {
int a = arr[i];
int b = arr[j];
int c = arr[k];
if (a * a + b * b == c * c) {
String triangle = a + " " + b + " " + c;
if (!triangles.contains(triangle)) {
triangles.add(triangle);
count++;
}
}
}
}
}
System.out.println(count);
}
}
}
C++
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#include <algorithm>
#include <vector>
#include <time.h>
#include <bitset>
using namespace std;
vector<int> split(string str) {
vector<int> res;
while(str.find(' ')!=str.npos) {
int position=str.find(' ');
string tmp=str.substr(0,position);
res.push_back(stoi(tmp));
str=str.substr(position+1);
}
res.push_back(stoi(str));
return res;
}
int main() {
int N;
string str;
getline(cin,str);
N=stoi(str);
while(N--) {
int tmp;
vector<int> vec;
int n;
cin>>n;
for(int i=0;i<n;i++) {
cin>>tmp;
vec.push_back(tmp);
}
sort(vec.begin(),vec.end());
int res=0;
map<vector<int>,int> mp;//去除重复三角形
for(int i=0;i<n-2;i++) {
for(int j=i+1;j<n-1;j++) {
for(int k=j+1;k<n;k++) {
int a=vec[i],b=vec[j],c=vec[k];
if(a>0 && b>0 && c>0 && a+b>c && a*a+b*b==c*c) {
if(mp[{a,b,c}]==0)
res++;
mp[{a,b,c}]++;
vec[i]=0;
vec[j]=0;
vec[k]=0;
}
}
}
}
cout<<res<<endl;
}
system("pause");
return 0;
}
python
import sys
N=int(input())
while N>0:
vec=input().split()
n=int(vec[0])
arr=[]
for i in range(1,len(vec)):
arr.append(int(vec[i]))
arr.sort()
s=[]
N-=1
for i in range(n-2):
for j in range(i+1,n-1):
for k in range(j+1,n):
a=arr[i]
b=arr[j]
c=arr[k]
if a+b>c and a*a+b*b==c*c:
if [a,b,c] not in s:
s.append([a,b,c])
arr[i]=0
arr[j]=0
arr[k]=0
print(len(s))