Group Photo 2 (online mirror version) CodeForces - 529B

贪心贪心......

题目链接

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300005;
int h[N],w[N],n;
struct rec{
    int h,w;
}a[N];
int sum;
bool check(int H){
    int num=0,W=0;
    priority_queue<int,vector<int>,greater<int>>q;
    for(int i=0;i<n;++i){
        if(a[i].h>H&&a[i].w>H) return false;//H不可能
        else if(a[i].w<=H&&H<a[i].h){//必须liedown
            ++num;
            W+=a[i].h;
        }else if(a[i].h<=H&&H<a[i].w){//必须竖着
            W+=a[i].w;
        }else if( a[i].h<=H && a[i].w<=H ){ //有可能放倒更优的 加入队列
            q.push(a[i].h-a[i].w);
            W+=a[i].w;
        }
    }
    if(num>n/2) return false;
    for(int i=0; i<n/2-num && q.size(); ++i){
        if(q.top()>=0) break;//a[i].h>a[i].w后 不能再liedown
        W+=q.top();
        q.pop();
    }
    sum=W*H;
    return true;
}

int main(){
    scanf("%d",&n);
    int H=0;
    for(int i=0;i<n;++i){
        scanf("%d%d",&a[i].w,&a[i].h);
        H=max(max(a[i].h,a[i].w),H);//这里取最大的可能的值!
    }

    int ans=1000000000;
    //sort(a,a+n);
    for(int i=1;i<=H;++i){//枚举最大高度
        if(!check(i)) continue;
        ans=min(ans,sum);
    }

    printf("%d\n",ans);
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值