Codeforces Round #378 (Div. 2) D - Kostya the Sculptor

Kostya the Sculptor

这次cf打的又是心累啊,果然我太菜,真的该认真学习,不要随便的浪费时间啦

【题目链接】Kostya the Sculptor

&题意:

给你n个长方体,你要使长方体的内切球有体积最大,有两种选择方案
①只选1个长方体。
②选2个长方体,黏到一起,但这2个长方体黏的那一面必须完全相等。也就是长宽相等。

&题解:

1个长方体遍历一遍取最小就好了。
2个的时候要第2短的和第3短的相等,才能合到一起,最小的有可能是2个最小的相加,或者是第2短的那个。
这题比赛的时候,总是在想如果相等的在最后怎么办,还要特殊处理,好像并没有处理好,所以总是wa。
现在想来根本不用,只要在最后加一个绝对不可能相等的数据就好了,这就减少了特殊处理最后一组的麻烦。应记住。
这也是用过好多次的方法了,不知道为什么当时就想不起来了 = =
还有输出的格式问题,为什么我注释的那块就不对呢?我还真的不知道,如果有大神看见,希望能评论回答一下!

【时间复杂度】O(\(n\))

&代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
#define cle(a,val) memset(a,(val),sizeof(a))
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d %d",&(N),&(M))
#define SIII(N,M,K) scanf("%d %d %d",&(N),&(M),&(K))
#define rep(i,b) for(int i=0;i<(b);i++)
#define rez(i,a,b) for(int i=(a);i<=(b);i++)
#define red(i,a,b) for(int i=(a);i>=(b);i--)
const ll LINF = 0x3f3f3f3f3f3f3f3f;
#define PU(x) puts(#x);
#define PI(A) cout<<(A)<<endl;
#define DG(x) cout<<#x<<"="<<(x)<<endl;
#define DGG(x,y) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<endl;
#define DGGG(x,y,z) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<" "<<#z<<"="<<(z)<<endl;
#define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl;
#define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;}
const double EPS = 1e-9 ;
/*     C o d i n g  S p a c e     */
const int MAXN = 100000 + 9 ;
struct Node
{
    ll x,y,z;
    int id;
}no[MAXN];
bool cmp(const Node& A,const Node& B){
    if (A.y==B.y) return A.z==B.z?A.x<B.x:A.z<B.z;
    else return A.y<B.y;
}
int n;
void Solve()
{
    while(~SI(n)){
        rep(i,n){
            int t[5];
            rep(j,3) SI(t[j]);
            sort(t,t+3);
            no[i].x=t[0],no[i].y=t[1],no[i].z=t[2],no[i].id=i+1;
        }
        ll re1=0,re2=1;
        rep(i,n){
            if (re1<no[i].x){
                re1=no[i].x,re2=no[i].id;
            }
        }
        sort(no,no+n,cmp);
        ll re3=0,re4=1,re5=1;
        Node t;
        t.x=-1,t.y=-1,t.id=-9;
        no[n++]=t;
        rep(i,n-1){
            if (no[i].z==no[i+1].z&&no[i].y==no[i+1].y){
                while(no[i].z==no[i+1].z&&no[i].y==no[i+1].y) i++;
                if (re3<min(no[i].x+no[i-1].x,no[i].y)){
                    re3=min(no[i].x+no[i-1].x,no[i].y);
                    re4=no[i].id,re5=no[i-1].id;
                }
            }
        }
        if (re3>re1){
            
            printf("2\n%d",re4);
            printf(" %d\n",re5);
            //上面的是对的,但下面的就是错的,一样的东西啊,不知道为什么
            // printf("2\n%d %d\n",re4,re5);
        }
        else{
            printf("1\n%d\n",re2);
        }
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("1.out","w",stdout);
#endif
//iostream::sync_with_stdio(false);
//cin.tie(0), cout.tie(0);
    // int T;cin>>T;while(T--)
    Solve();
    return 0;
}

转载于:https://www.cnblogs.com/s1124yy/p/6021611.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值