码迷,mamicode.com
首页 > 其他好文 > 详细

codeforce 589B枚举

时间:2017-08-25 13:56:53      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:i++   wro   inpu   can   blog   section   --   clear   宽度   

2017-08-25 12:00:53

writer:pprp

很简单的枚举,但是我调试了很长时间,出现各种各样的问题

/*
theme:cf 589B
writer:pprp
declare:枚举
date:2017/8/25
*/

#include <bits/stdc++.h>

using namespace std;
const int N = 4040;
typedef long long ll;
ll ans = -1, record_w = -1, record_h = -1;

class rect
{
public:
    int w;
    int h;

    bool operator <(const rect & r2)
    {
        return w < r2.w;
    }

};

rect rec[N];


int main()
{
    int n;
    scanf("%d",&n);

    //input section
    for(int i = 0 ; i < n ; i++)
    {
        scanf("%d%d",&rec[i].w, &rec[i].h);
        //w is bigger than h
        if(rec[i].w > rec[i].h)    //w > h??
            swap(rec[i].w,rec[i].h);
    }
    //sort the w
    sort(rec,rec + n);

    //define a vector to store the height
    vector<int> hh;

    //从小到大枚举w的长度
    for(int i = 0 ; i < n ; i++)
    {
        hh.clear();
        //将宽度高于w的对象的h储存在vector中
        for(int j = i  ; j < n ; j++)
            hh.push_back(rec[j].h);

        //对高度进行排序
        sort(hh.begin(), hh.end());

        //记录当前高度
        int len = hh.size();
        
        //枚举当前w的情况下,采用不同的h的最佳解
        for(int j = 0 ; j < hh.size() ; j++, len--)
        {
            ll cmp = (ll)rec[i].w * hh[j] * len;    //wrong before: (ll)(rec[i].w * hh[j] * len) 这样就会越界
            if(cmp > ans)
            {
                ans = cmp;
                record_h = hh[j];
                record_w = rec[i].w;
            }
        }
    }
    cout << ans << endl;
    cout << record_w << " " << record_h << endl;

    return 0;
}

 

codeforce 589B枚举

标签:i++   wro   inpu   can   blog   section   --   clear   宽度   

原文地址:http://www.cnblogs.com/pprp/p/7427344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!