cf589B Layer Cake 排序

题目大意:给定n块蛋糕,高为1,长宽输入,问最大的相同体积的体积和是多少。

思路:按长边升序排列,相等时短边升序。枚举每个长和宽,每次枚举时从长边对应的最短宽边开始,对当前位置以后的宽边进行重新排序,则比当前的长和宽大于等于的蛋糕个数就可以确定,体积和也可以确定。

ps:刚开始暴力,显然超时,给了三重循环,,,

 #include <bits/stdc++.h>

using namespace std;
struct cake
{
    long long l , w;
}arr[4001] , A[4001];
int ans[4001];
int n;

bool cmp(cake a , cake b)
{
    return a.w < b.w;
}

bool cmp2(cake a , cake b)
{
    if(a.l == b.l) return a.w < b.w;
    return a.l < b.l;
}


int main()
{
    while(scanf("%d" , &n) != EOF)
    {
        int t1 , t2 ;
        for(int i = 0 ; i < n ; i ++)
        {
            scanf("%d %d" , &t1 , &t2);
            if(t1 > t2) swap(t1 , t2);
            arr[i].w = t1 , arr[i].l  = t2;
        }
        sort(arr , arr + n , cmp2);
        long long maxx = -1;
        long long sum = 0;
        int  ml = -1 , mw = -1 ;
        memcpy(A , arr , sizeof(arr));
        for(int i = 0 ; i < n ; i ++)
        {
            memcpy(arr , A , sizeof(A));
            sort(arr + i , arr + n , cmp);
            for(int j = i ; j < n ; j ++)
            {
                sum = A[i].l * arr[j].w * (n - j) ;
               if(sum > maxx)
               {
                   maxx = sum ;
                   ml = A[i].l;
                   mw = arr[j].w;
               }
            }
        }
        printf("%I64d\n%d %d\n" , maxx , ml , mw);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值