Codeforces378 D Kostya the Sculptor(贪心)(逻辑)

Kostya the Sculptor

time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Kostya is a genial sculptor, he has an idea: to carve a marble sculpture in the shape of a sphere. Kostya has a friend Zahar who works at a career. Zahar knows about Kostya's idea and wants to present him a rectangular parallelepiped of marble from which he can carve the sphere.

Zahar has n stones which are rectangular parallelepipeds. The edges sizes of the i-th of them are ai, bi and ci. He can take no more than two stones and present them to Kostya.

If Zahar takes two stones, he should glue them together on one of the faces in order to get a new piece of rectangular parallelepiped of marble. Thus, it is possible to glue a pair of stones together if and only if two faces on which they are glued together match as rectangles. In such gluing it is allowed to rotate and flip the stones in any way.

Help Zahar choose such a present so that Kostya can carve a sphere of the maximum possible volume and present it to Zahar.

Input

The first line contains the integer n (1 ≤ n ≤ 105).

n lines follow, in the i-th of which there are three integers ai, bi and ci (1 ≤ ai, bi, ci ≤ 109) — the lengths of edges of the i-th stone. Note, that two stones may have exactly the same sizes, but they still will be considered two different stones.

Output

In the first line print k (1 ≤ k ≤ 2) the number of stones which Zahar has chosen. In the second line print k distinct integers from 1 to n — the numbers of stones which Zahar needs to choose. Consider that stones are numbered from 1 to n in the order as they are given in the input data.

You can print the stones in arbitrary order. If there are several answers print any of them.

Examples
Input
6
5 5 5
3 2 4
1 4 1
2 1 3
3 2 4
3 3 4
Output
1
1
Input
7
10 7 8
5 10 3
4 2 6
5 5 5
10 2 8
4 2 1
7 7 7
Output
2
1 5
Note

In the first example we can connect the pairs of stones:

  • 2 and 4, the size of the parallelepiped: 3 × 2 × 5, the radius of the inscribed sphere 1
  • 2 and 5, the size of the parallelepiped: 3 × 2 × 8 or 6 × 2 × 4 or 3 × 4 × 4, the radius of the inscribed sphere 1, or 1, or 1.5 respectively.
  • 2 and 6, the size of the parallelepiped: 3 × 5 × 4, the radius of the inscribed sphere 1.5
  • 4 and 5, the size of the parallelepiped: 3 × 2 × 5, the radius of the inscribed sphere 1
  • 5 and 6, the size of the parallelepiped: 3 × 4 × 5, the radius of the inscribed sphere 1.5

Or take only one stone:

  • 1 the size of the parallelepiped: 5 × 5 × 5, the radius of the inscribed sphere 2.5
  • 2 the size of the parallelepiped: 3 × 2 × 4, the radius of the inscribed sphere 1
  • 3 the size of the parallelepiped: 1 × 4 × 1, the radius of the inscribed sphere 0.5
  • 4 the size of the parallelepiped: 2 × 1 × 3, the radius of the inscribed sphere 0.5
  • 5 the size of the parallelepiped: 3 × 2 × 4, the radius of the inscribed sphere 1
  • 6 the size of the parallelepiped: 3 × 3 × 4, the radius of the inscribed sphere 1.5

It is most profitable to take only the first stone.

 详细解析见 http://www.cnblogs.com/--ZHIYUAN/p/6018821.html

此题利用了一个道理,要想两块砖合并后的最短直径比合并之前长,那么一定是两块砖最短的那条边相加,所以对于每块砖边长从大到小排序后,再对所有的砖从小到大排序,

那么合并后会增加最短直径的两块砖必相邻。

//排序;普通的暴力会超时。后来看了别人的代码。神奇。
//把每个长方体三条边从小到大排一下存入,以每个长方体最大的那条边从小到大排序如下。这样两个最大值和次大值对应相等的面必然相邻
//这样每次比较相邻的两个就好了。如果最小的和第二大的对应相等怎么办如:(2 3 4),(1 2 5),(2 3 6),输入数据的时候就排除了,就算合起来还是2,3 小边。 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,flag1,flag2;
struct cub
{
    int a,b,c,ra;
}cu[100005];
bool cmp(cub x,cub y)           //排序
{
    if(x.a==y.a&&x.b==y.b) return x.c<y.c;
    if(x.a==y.a) return x.b<y.b;
    return x.a<y.a;
}
int main()
{
    int x,y,z;
    while(scanf("%d",&n)!=EOF)
    {
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            int xx=max(x,max(y,z)),zz=min(x,min(y,z)),yy=x+y+z-xx-zz;
            cu[i].a=xx;
            cu[i].b=yy;
            cu[i].c=zz;
            cu[i].ra=i;
            if(zz>ans)
            {
                ans=zz;
                flag1=i;
                flag2=0;
            }
        }
        sort(cu+1,cu+1+n,cmp);
        for(int i=2;i<=n;i++)
        {
            if(cu[i].a==cu[i-1].a&&cu[i].b==cu[i-1].b)
            {
                int Min=min(cu[i].c+cu[i-1].c,min(cu[i].a,cu[i].b));
                if(Min>ans)
                {
                    ans=Min;
                    flag1=cu[i].ra;
                    flag2=cu[i-1].ra;
                }
            }
        }
        if(flag2==0) printf("1\n%d\n",flag1);
        else printf("2\n%d %d\n",min(flag1,flag2),max(flag1,flag2));
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/jianrenfang/p/6020149.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值