• codeforce Group Photo 2 (online mirror version)


    题目大意:

    有n个矩形在地上排成一列,不可重叠,已知他们的宽度w和高度h,现在使至多[n / 2]个矩形旋转90度,问最后可以用多小的矩形恰好覆盖这n个矩形,求满足条件的最小矩形面积。

    n, w, h <= 1000。

    分析:

    数据范围比较小,可以枚举答案矩形的高度H,判断是否能只旋转至多[n / 2]个矩形使得n个矩形的高度均不超过H,再用剩下的操作次数尽量使得总宽度变少。

    贪心旋转,尽量把w比h大很多的矩形旋转,所以可以对矩形按照{w - h}排序,贪心旋转即可。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    #define maxn 1001
    #define INF ~0u >> 1
    using namespace std;
    struct Node
    {
    int w,h;
    bool operator <(const Node &ths) const
    {
    return w-h>ths.w-ths.h;
    }
    };
    Node a[maxn],b[maxn];
    int main()
    {
    int n,ans=INF;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    scanf("%d%d",&a[i].w,&a[i].h);
    for(int i=1;i<maxn;i++)
    {
    memcpy(b,a,sizeof(a));
    int flag=0,sum=0;
    for(int j=0;j<n;j++)
    {
    if(b[j].h>i)
    {
    if(b[j].w>i)
    {
    flag=1;
    break;
    }
    else
    {
    swap(b[j].w,b[j].h);
    sum++;
    }
    }
    }
    if(flag||sum*2>n)
    continue;
    sort(b,b+n);
    for(int j=0;j<n&&(sum+1)*2<=n;j++)
    {
    if(b[j].w<=i&&b[j].h<b[j].w)
    {
    swap(b[j].h,b[j].w);
    sum++;
    }
    }
    int ww=0;
    for(int j=0;j<n;j++)
    ww+=b[j].w;
    //printf("%d %d ",ww,i);
    ans=min(ans,ww*i);
    }
    printf("%d ",ans);
    return 0;
    }

  • 相关阅读:
    IO
    mouseover,mouseout和mouseenter,mouseleave
    【译】addEventListener 第二个参数
    Git 常用命令
    我对Backbone中url属性的理解
    小失误引起大失败
    收集各大网站的登录页面
    随笔2
    随笔1
    创建数据库
  • 原文地址:https://www.cnblogs.com/tsw123/p/4367646.html
Copyright © 2020-2023  润新知