【25.47%】【codeforces 733D】Kostya the Sculptor
time limit per test3 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard 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.
【题解】
用一个map来搞;
map<pair<int,int>,int> dic;
dic 保留底面为(int,int)的最大高(只有最大的高才有用),和这个高的长方体的id;
每次输入的a[0..2];
sort(a+0,a+3);
然后根据dic[a[0],a[1]]和dic[a[0],a[2]]以及dic[a[1],a[2]]的情况进行更新;
第一轮更新可以获得每个底面的最大高;
第二轮再更新一次就能获得最优解了;
然后只有一个长方体的情况第一轮更新就能得到了;
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
#define LL long long
using namespace std;
const int MAXN = 1e5*3+100;
const int MAXSIZE = 1e5+100;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
const double pi = acos(-1.0);
map< pair<int,int>,int> dic;
struct abc
{
int max,id;
};
int n;
LL a[3];
LL d[MAXSIZE][3];
int ans2 = 0,l,r,ans1 =0,id1,cnt = 0;
abc kk[MAXN];
void input_LL(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
void input_int(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)&&t!='-') t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
//map<pair<int,int>,int> dic;
//dic 保留底面为(int,int)的最大高;
int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_int(n);
for (int i = 1;i <= n;i++)
{
for (int j = 0;j <= 2;j++)
input_LL(d[i][j]);
sort(d[i]+0,d[i]+3);
for (int j = 0;j <= 2;j++)
a[j] = d[i][j];
LL temp1 = min(a[0],a[1]);
temp1 = min(temp1,a[2]);
if (temp1 > ans1)
{
ans1 = temp1;
id1 = i;
}
pair <int,int> temp;
temp = make_pair(a[0],a[1]);
if (!dic[temp])
{
dic[temp] = ++cnt;
kk[cnt].max = a[2];
kk[cnt].id = i;
}
else
{
int tt = dic[temp];
if (kk[tt].id!=i)
{
LL temp = min(a[0],a[1]);
temp = min(temp,kk[tt].max+a[2]);
if (temp > ans2)
ans2 = temp,l = kk[tt].id,r = i;
if (kk[tt].max<a[2])
{
kk[tt].max = a[2];
kk[tt].id = i;
}
}
}
temp = make_pair(a[0],a[2]);
if (!dic[temp])
{
dic[temp] = ++cnt;
kk[cnt].max = a[1];
kk[cnt].id = i;
}
else
{
int tt = dic[temp];
if (kk[tt].id!=i)
{
LL temp = min(a[0],a[2]);
temp = min(temp,kk[tt].max+a[1]);
if (temp > ans2)
ans2 = temp,l = kk[tt].id,r = i;
if (kk[tt].max<a[1])
{
kk[tt].max = a[1];
kk[tt].id = i;
}
}
}
temp = make_pair(a[1],a[2]);
if (!dic[temp])
{
dic[temp] = ++cnt;
kk[cnt].max = a[0];
kk[cnt].id = i;
}
else
{
int tt = dic[temp];
if (kk[tt].id!=i)
{
LL temp = min(a[1],a[2]);
temp = min(temp,kk[tt].max+a[0]);
if (temp > ans2)
ans2 = temp,l = kk[tt].id,r = i;
if (kk[tt].max<a[0])
{
kk[tt].max = a[0];
kk[tt].id = i;
}
}
}
}
for (int i = 1;i <= n;i++)
{
for (int j = 0;j <= 2;j++)
a[j] = d[i][j];
pair <int,int> temp;
temp = make_pair(a[0],a[1]);
int tt = dic[temp];
if (kk[tt].id!=i)
{
LL temp = min(a[0],a[1]);
temp = min(temp,kk[tt].max+a[2]);
if (temp > ans2)
ans2 = temp,l = kk[tt].id,r = i;
}
temp = make_pair(a[0],a[2]);
tt = dic[temp];
if (kk[tt].id!=i)
{
LL temp = min(a[0],a[2]);
temp = min(temp,kk[tt].max+a[1]);
if (temp > ans2)
ans2 = temp,l = kk[tt].id,r = i;
}
temp = make_pair(a[1],a[2]);
tt = dic[temp];
if (kk[tt].id!=i)
{
LL temp = min(a[1],a[2]);
temp = min(temp,kk[tt].max+a[0]);
if (temp > ans2)
ans2 = temp,l = kk[tt].id,r = i;
}
}
if (ans1>=ans2)
{
puts("1");
printf("%d\n",id1);
}
else
{
puts("2");
if (l < r)
printf("%d %d\n",l,r);
else
printf("%d %d\n",r,l);
}
return 0;
}
【25.47%】【codeforces 733D】Kostya the Sculptor的更多相关文章
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【66.47%】【codeforces 556B】Case of Fake Numbers
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【47.40%】【codeforces 743B】Chloe and the sequence
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【25.64%】【codeforces 570E】Pig and Palindromes
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【25.33%】【codeforces 552D】Vanya and Triangles
time limit per test4 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...
- 【47.95%】【codeforces 554C】Kyoya and Colored Balls
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【25.00%】【codeforces 584E】Anton and Ira
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces 510C】Fox And Names
[题目链接]:http://codeforces.com/contest/510/problem/C [题意] 给你n个字符串; 问你要怎么修改字典序; (即原本是a,b,c..z现在你可以修改每个字 ...
- 【codeforces 807B】T-Shirt Hunt
[题目链接]:http://codeforces.com/contest/807/problem/B [题意] 你在另外一场已经结束的比赛中有一个排名p; 然后你现在在进行另外一场比赛 然后你当前有一 ...
随机推荐
- 1.6 Python基础知识 - for循环
在循环语句中,除了while循环外,还有一种循环叫for循环的循环语句,for循环语句用于遍历可迭代(什么是迭代?以及迭代的相关知识,我们到后面再进行阐述,这里只要记住就可以了.)对象集合中的元素,并 ...
- Java 服务端入门和进阶指南
作者:谢龙 链接:https://www.zhihu.com/question/29581524/answer/44872235 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 现在互联网上资 ...
- Android 自己定义主菜单
本文介绍一个超简单的自己定义主菜单.效果例如以下: 原理:事实上就是对原生的Dialog的一个简单的封装.并加上显示和隐藏的动画效果.再给控件加上回调事件. TestDialog.java publi ...
- JAVA一些基础概念
Java (计算机编程语言) Java是一门面向对象编程语言,不仅吸收了C++语言的各种长处,还摒弃了C++里难以理解的多继承.指针等概念.因此Java语言具有功能强大和简单易用两个特征. Java语 ...
- LA 3135 - Argus
看题:传送门 大意就是让你编写一个称为argus的系统,这个系统支持一个register的命令: Register Q_num Period 该命令注册了一个触发器,它每Period秒就会残生一个编 ...
- anaconda中实现双spyder版本
1)先在conda中创建一个名为python2的环境,并下载对应版本python2.7 conda create --name python27 python=2.7 2)激活python2环境 ac ...
- Android基础新手教程——1.2 开发环境搭建
Android基础新手教程--1.2 开发环境搭建 标签: Android基础新手教程 如今主流的Android开发环境有: ①Eclipse + ADT + SDK ②Android Studio ...
- [Recompose] Render Nothing in Place of a Component using Recompose
Learn how to use the ‘branch’ and ‘renderNothing’ higher-ordercomponents to render nothing when a ce ...
- 使用LAMP创建基于wordpress的个从博客网站 分类: B3_LINUX 2014-07-15 16:45 800人阅读 评论(0) 收藏
参考: http://blog.csdn.net/ck_boss/article/details/27866117 一.mysql配置 1.安装mysql yum install mysql-serv ...
- 序列 mysql
CREATE TABLE emp_seq (seq INT); INSERT INTO emp_seq VALUES(0); UPDATE emp_seq SET seq = LAST_INSERT_ ...