给出a,b,c三边,可以rotate 长宽高可以互换
平行六面体内接球半径由六面体最短的那条边决定 所以最短边越大好,排好序:按较大两边相同 合并第三边后,取最短边后更新即可
#include <iostream>
#include <algorithm>
#include <list>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N= 1e6+20;
struct Node
{
int a,b,c;//边长从大到小
int id;
bool operator<(const Node &t)const
{
if(a!=t.a) return a<t.a;
if(b!=t.b) return b<t.b;
return c<t.c;
}
}node[N];
int main()
{
int n;
cin>>n;
int ans=0,id1,id2;//取一件和两件的最大半径的编号
//平行六面体的最短边越大,内接球的半径也就越大
for(int i=0;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
//可以rotate
if(c>b)
swap(b,c);
if(c>a)
swap(a,c);
if(a<b)
swap(a,b);
if(ans<c)
{
ans=c;
id1=i+1;
}
node[i].a=a;
node[i].b=b;
node[i].c=c;
node[i].id=i+1;
}
sort(node,node+n);
int i=0,r;
while(i<n)
{
r=i;
while(r<n&&node[r].a==node[i].a&&node[r].b==node[i].b)
r++;
r--;
//相同的两个面合并,使最短边尽可能的大,最最大的两个c合并
if(r==i)
{
i=r+1;
continue;
}
int res=node[r].b;
res=min(res,node[r].c+node[r-1].c);
if(ans<res)
{
ans=res;
id1=-1;
id2=r;//
}
i=r+1;//
}
if(id1>0)
{
cout<<1<<endl<<id1<<endl;
}
else
cout<<2<<endl<<node[id2-1].id<<" "<<node[id2].id<<endl;
return 0;
}