题目链接:
http://codeforces.com/contest/733/problem/D
题解:
题目大意:给你n个矩形的长宽高,你可以选择用一个或两个矩形,求出最大的内切圆的半径。(如果你选择合并的话,必须有一个面一样)。
贪心,主要的难点是怎么判断两个矩形合并后的三边的值。这里的话,就要用到贪心,将每一个矩形的三边都按从大到小进行排列,那么只要判断相邻的两个矩形就行了。
代码:
#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
struct node
{
int x,y,z;
int pos;
}s[maxn];
int cmp(node a,node b)
{
if(a.x!=b.x)
return a.x>b.x;
if(a.y!=b.y)
return a.y>b.y;
return a.z>b.z;
}
int main()
{
int n;
scanf("%d",&n);
int num[3];
met(num,0);
double Max=0;
double ans=0;
int pos=0;
for(int i=0;i<n;i++)
{
ans=0;
for(int j=0;j<3;j++)
scanf("%d",&num[j]);
sort(num,num+3);
s[i].x=num[2];
s[i].y=num[1];
s[i].z=num[0];
s[i].pos=i+1;
ans=(num[0]*1.0)/2;
if(Max<ans)
{
pos=i+1;
Max=ans;
}
}
sort(s,s+n,cmp);
int flag=0;
int pos1=0,pos2=0;
for(int i=0;i<n-1;i++)
{
ans=0;
if(s[i].x==s[i+1].x&&s[i].y==s[i+1].y)
{
num[0]=s[i].z+s[i+1].z;
num[1]=s[i].y;
num[2]=s[i].x;
sort(num,num+3);
ans=(num[0]*1.0)/2;
if(ans>Max)
{
flag=1;
Max=ans;
pos1=s[i].pos;
pos2=s[i+1].pos;
}
}
}
if(!flag)
{
printf("1\n");
printf("%d\n",pos);
}
else
{
printf("2\n");
printf("%d %d\n",pos1,pos2);
}
}