思路:因为雕刻小球只能选择长方体最小的边,所以如果将两个长方体拼在一块,只有将他们由最长边和次长边组成的那一面拼在一起,才能增加雕刻小球的直径,不然如果拼在一起的面中含有最小边,那最小边在新的长方体中仍然存在,这样并没有增大能雕刻的小球的直径。所以,让每个长方体的边长从大到小排序,然后如果两个长方体想拼接,必须是他们最长边和次长边组成的面全等才能拼接,以此类推。
#include<bits/stdc++.h>
using namespace std;
struct node
{
long long x;
long long y;
long long z;
int num;
}arr[100005];
bool cmp(node a,node b)
{
if(a.x>b.x)
return true;
else if(a.x==b.x)
{
if(a.y>b.y)
return true;
else if(a.y==b.y)
{
if(a.z>b.z)
return true;
else
return false;
}
else
return false;
}
else
return false;
}
int main()
{
int n;
cin>>n;
long long a,b,c;
long long max1=0,temp;
for(int i=1;i<=n;i++)
{
cin>>a>>b>>c;
long long sum=a+b+c;
arr[i].x=max(a,max(b,c));
arr[i].z=min(a,min(b,c));
arr[i].y=sum-arr[i].x-arr[i].z;
if(max1<arr[i].z)
{
max1=arr[i].z;
temp=i;
}
arr[i].num=i;
}
sort(arr+1,arr+1+n,cmp);
long long now;
int l,r,flag=0;
for(int i=1;i<=n-1;i++)
{
if(arr[i+1].x==arr[i].x&&arr[i].y==arr[i+1].y)
{
now=arr[i+1].z+arr[i].z;
if(max1<min(now,arr[i].y))
{
max1=min(arr[i].y,now);
l=arr[i].num;
r=arr[i+1].num;
flag=1;
}
}
}
if(flag)
cout<<2<<endl<<l<<' '<<r<<endl;
else
cout<<1<<endl<<temp<<endl;
return 0;
}