Codeforces 733D Kostya the Sculptor 贪心

点击打开链接

给出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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值