Codeforces 733D Kostya the Sculptor

题目大意:有n个长方体石块,从中挑选不超过两块来雕刻一个球。要使球的半径最大,输出要选几个石块,以及选择的石块的编号。可以选择两个石块,用胶水把他们粘合。但两个石块的粘合面必须相同,完全吻合。

简单分析可知,球的半径取决于长方体的最小维度。那么我们粘合两个石块时需要粘合的显然是非最小的维度组成的那个面,否则粘合并没有起到扩大半径的作用。

输入时,将三个维度按大小排序好。再对所有石块进行排序,以最大维度为第一关键字,以次维度为第二关键字,最小维度为第三关键字。那么我们只需要遍历所有石块,并尝试粘合相邻石块即可得出答案。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1e5+15;
struct node{
    int l, w, h;
    int id;
};
bool cmp(node a,node b){
    if(a.l==b.l){
        if(a.w==b.w) return a.h<b.h;
        return a.w<b.w;
    }
    return a.l<b.l;
}
node nod[maxn];
int n;
int main(){
    int a[3];

    scanf("%d",&n);
    for(int i=0;i<n;i++){
        for(int i=0;i<3;i++)
            scanf("%d",&a[i]);
        sort(a,a+3);
        nod[i].l=a[2];
        nod[i].w=a[1];
        nod[i].h=a[0];
        nod[i].id=i+1;
    }
    sort(nod,nod+n,cmp);
    int ans_id1=-1, ans_id2=-1;
    int ans_r=0;
    for(int i=0;i<n;i++){
        if(nod[i].h>ans_r){
            ans_r=nod[i].h;
            ans_id1=nod[i].id;
            ans_id2=-1;
        }
        if(nod[i].l==nod[i+1].l&&nod[i].w==nod[i+1].w){
            int r=min(nod[i].w,nod[i].h+nod[i+1].h);
            if(r>ans_r){
                ans_r=r;
                ans_id1=nod[i].id;
                ans_id2=nod[i+1].id;
            }
        }
    }
    if(ans_id2==-1)
        printf("1\n%d\n",ans_id1);
    else
        printf("2\n%d %d\n",ans_id1,ans_id2);


    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值