最多直角三角形个数
题目描述
有N条线段,长度分别为a[1]-a[n])。现要求你计算这N条线段最多可以组合成几个直角三角形,每条线段只能使用一次,每个三角形包含三条线段。
输入描述
第一行输入一个正整数工(1<=T<= 100),表示有T组测试数据。
对于每组测试数据,接下来有T行,每行第一个正整数N,表示线段个数,(3<=N<20),接着是N个正整数,表赤每条线段长度,(0<a[i]<100) .
输出描述
对于每组测试数据输出一行,每行包括一个整数,表示最多能组合的直角三角形个数。
示例
示例1
input1:
1
7 3 4 5 6 5 12 13
outpu1:
2
input2:
1
7 3 4 5 6 6 12 13
input3:
1
思路
使用dfs找出所有的组合,之后对于每一种组合求解即可,在求解的同时维护最大数量,最后输出即可,由于是T组数据,我们应当在每次开始时初始化path和ans
代码
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
vector<int> x(2);
vector<int> len, vis;
void dfs(int d, int s)
{
x[0] = max(x[0], s);
if (d == x[1]) {
return;
}
for (int i = d + 1; i < x[1]; i++) {
for (int j = i + 1; j < x[1]; j++) {
if (vis[d] + vis[i] + vis[j] == 0 and len[d] * len[d] + len[i] * len[i] == len[j] * len[j]) {
vis[d] = vis[i] = vis[j] = 1;
dfs(d + 1, s + 1);
vis[d] = vis[i] = vis[j] = 0;
}
}
}
dfs(d + 1, s);
}
void solution()
{
int n;
cin >> n;
len = vector<int>(n);
for (int& it : len) {
cin >> it;
}
x[0] = x[1] = 0;
vis = vector<int>(50050, 0);
x[1] = n;
sort(len.begin(), len.end());
x[0] = 0;
map<int, int> mp;
dfs(0, 0);
cout << x[0] << endl;
}
int main()
{
int t;
cin >> t;
while (t--) {
solution();
}
return 0;
}
/*
2
7 3 4 5 6 5 12 13
7 3 4 5 6 6 12 13
2
1
*/