【Codeforces 733D】 Kostya the Sculptor【贪心】

题意:

给你n个长方形,让你找出2个或1个长方体,使得他们拼接成的长方体的内接圆半径最大(两个矩形拼接的条件是他们有一个面完全相同)

题解:

很容易想到一个长方体的内接圆半径是由他的最短的那条边决定的,

设长方体的边长从大到小分别为a,b,c,

只有用a*b这个面和别的长方体拼接,才有可能使得拼接后的长方体内接圆半径更大

于是,根据上述

我们读入的时候将长方体边长排序

然后sort 以a为第一关键字 以b为第二关键字 以c为第三关键字

每次维护l,r保证小标从l到r的长方体a和b是相同的

然后去c[r-1],c[r]拼接就是这部分的最大答案

#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define PB push_back
#define MP make_pair
#define ll long long
#define MS(a,b) memset(a,b,sizeof(a))
#define LL (rt<<1)
#define RR (rt<<1|1)
#define lson l,mid,LL
#define rson mid+1,r,RR
#define pii pair<int,int>
#define pll pair<ll,ll>
#define lb(x) (x&(-x))
void In(){freopen("in.in","r",stdin);}
void Out(){freopen("out.out","w",stdout);}
const int N=1e5+10;
const int M=3e5+10;
const int Mbit=1e6+10;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
struct node
{
    int a,b,c,id;
    bool operator <(const node &rhs)const{
        if(a!=rhs.a)return a<rhs.a;
        if(b!=rhs.b)return b<rhs.b;
        return c<rhs.c;
    }
}tmp[N];
int main()
{
    int n;
    while(~scanf("%d",&n)){
        int ans=0,id=0;
        for(int i=0;i<n;i++){
            int a,b,c;scanf("%d%d%d",&a,&b,&c);
            if(a<b)swap(a,b);
            if(b<c)swap(b,c);
            if(a<b)swap(a,b);
            tmp[i].a=a;tmp[i].b=b;tmp[i].c=c;tmp[i].id=i+1;
            if(tmp[i].c>ans)ans=tmp[i].c,id=i+1;
        }
        sort(tmp,tmp+n);
        int l=0,r=0,id1=0,id2=0;
        while(1){
            r=l;
            if(l==n)break;
            while(tmp[r].a==tmp[l].a&&tmp[r].b==tmp[l].b&&r<n)
                r++;
            r--;
            if(l==r){l=r+1;continue;}
            else{
                int x=min(tmp[r].a,tmp[r].b);
                x=min(x,tmp[r].c+tmp[r-1].c);
                if(x>ans)ans=x,id1=tmp[r].id,id2=tmp[r-1].id;
                l=r+1;
            }
        }
        if(id1&&id2)
            printf("2\n%d %d\n",id1,id2);
        else
            printf("1\n%d\n",id);
    }
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值