题目大意:有n个长方体石块,从中挑选不超过两块来雕刻一个球。要使球的半径最大,输出要选几个石块,以及选择的石块的编号。可以选择两个石块,用胶水把他们粘合。但两个石块的粘合面必须相同,完全吻合。
简单分析可知,球的半径取决于长方体的最小维度。那么我们粘合两个石块时需要粘合的显然是非最小的维度组成的那个面,否则粘合并没有起到扩大半径的作用。
输入时,将三个维度按大小排序好。再对所有石块进行排序,以最大维度为第一关键字,以次维度为第二关键字,最小维度为第三关键字。那么我们只需要遍历所有石块,并尝试粘合相邻石块即可得出答案。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1e5+15;
struct node{
int l, w, h;
int id;
};
bool cmp(node a,node b){
if(a.l==b.l){
if(a.w==b.w) return a.h<b.h;
return a.w<b.w;
}
return a.l<b.l;
}
node nod[maxn];
int n;
int main(){
int a[3];
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int i=0;i<3;i++)
scanf("%d",&a[i]);
sort(a,a+3);
nod[i].l=a[2];
nod[i].w=a[1];
nod[i].h=a[0];
nod[i].id=i+1;
}
sort(nod,nod+n,cmp);
int ans_id1=-1, ans_id2=-1;
int ans_r=0;
for(int i=0;i<n;i++){
if(nod[i].h>ans_r){
ans_r=nod[i].h;
ans_id1=nod[i].id;
ans_id2=-1;
}
if(nod[i].l==nod[i+1].l&&nod[i].w==nod[i+1].w){
int r=min(nod[i].w,nod[i].h+nod[i+1].h);
if(r>ans_r){
ans_r=r;
ans_id1=nod[i].id;
ans_id2=nod[i+1].id;
}
}
}
if(ans_id2==-1)
printf("1\n%d\n",ans_id1);
else
printf("2\n%d %d\n",ans_id1,ans_id2);
return 0;
}