• POJ 8208 矩形分割 【二分】【北大ACM/ICPC竞赛训练】


     要使两边面积之差最小且保证小矩形直线左边面积大于等于右边面积,在此基础上使大矩形在直线左边的面积尽量大。

    想了想后我把这道题分为两步解决,首先找到面积之差的最小值;然后想到一个范围内划直线都是这个最小值,在这个范围内找到最右边的(即保证大矩形左边的面积最大)。

    第一次二分算面积之差最小值,square(k)返回x=k这条直线左边小矩形的面积,s是所有小矩形的面积;若square(k)>=s-square(k),那面积差最小就在k的左边(包括k),不然就在k+1右边找。

    第二次二分的本质是左右矩形的差,首先保证直线左边小矩形面积大于等于小矩形右边面积,然后如果cha>mincha,那就在k左边找;不然的话cha=mincha(因为不会更小了)那就往k右边找

     1 #include<iostream>
     2 #define ll long long
     3 using namespace std;
     4 
     5 long long s,minc=1000000000000;
     6 int l[10005],t[10005],w[10005],h[10005],n;
     7 long long square(int k){//划出x=k这条直线,小矩形在直线左边的面积
     8     long long ans=0;
     9     for(int i=1;i<=n;i++){
    10         if(l[i]+w[i]<=k) ans+=(ll)w[i]*h[i];
    11         else if( l[i]<k ) ans+=(ll)(k-l[i])*h[i];
    12     }
    13     return ans;
    14 }  
    15 
    16 int main(){
    17     int r; cin>>r>>n;
    18     for(int i=1;i<=n;i++) {
    19         cin>>l[i]>>t[i]>>w[i]>>h[i];
    20         s+=(ll)w[i]*h[i];
    21     }
    22     
    23     int start=0,end=r,mid,ans;
    24     while(end>=start){
    25         mid = (start+end)/2;
    26         long long sq=square(mid);
    27         //cout<<start<<" "<<mid<<" "<<end<<" "<<sq<<endl;
    28         //小矩形在直线左边的面积随着直线向右平移逐渐减小 
    29         if( sq>=s-sq){
    30             minc=sq*2-s;
    31             end=mid-1;
    32         }
    33         else start=mid+1;
    34     }
    35     
    36     start=0,end=r;
    37     while(end>=start){
    38         mid = (start+end)/2;
    39         long long sq=square(mid),cha=sq*2-s;
    40         //cout<<start<<" "<<mid<<" "<<end<<" "<<sq<<endl; 
    41         if( sq>=s-sq ){//直线左边小矩形面积大于右边的 
    42             if(cha>minc) end=mid-1;
    43             else ans=mid,start=mid+1;
    44         }
    45         else start=mid+1;
    46     }
    47     
    48     //cout<<minc<<endl; 
    49     cout<<ans;
    50     
    51     return 0;
    52 }
  • 相关阅读:
    遍历frame中的表单:
    java分页算法
    将oracle数据库表使用命令的形式导入到excle文件中 亲测可用!
    关于解决java读取excel文件遇空行抛空指针的问题 !
    对Excle的行和列进行检查 单元格类型转换代码 ;
    java读取xls和xlsx数据作为数据驱动来用
    关于java读取excle文件的相关方法 ;
    转 Maven常用仓库地址以及手动添加jar包到仓库
    Luogo P2324 [SCOI2005]骑士精神
    Luogu P2483 【模板】k短路([SDOI2010]魔法猪学院)
  • 原文地址:https://www.cnblogs.com/ZhenghangHu/p/9357333.html
Copyright © 2020-2023  润新知