• hihocoder 2015 北京区域赛 A Xiongnu's Land


      题目链接:https://vjudge.net/contest/162845#problem/A

      题目描述:一个正方形内有n个长方形, 从中间切一刀使两边的面积尽可能相等且左面大于等于右面, 输出一个整数表示切得坐标。

      解题思路:很明显的二分, 两次二分, 第一次二分使面积尽可能相等, 第二次使左面尽可能大于右面。

      代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 10000 + 8;
    #define ll long long
    typedef struct {
        ll x;
        ll y;
        ll w;
        ll h;
    }node;
    
    node f[MAXN];
    int n;
    
    ll fun( ll x ) {
        ll temp = 0;
        for( int i = 0; i < n; i++ ) {
            temp += f[i].h*max( (ll)0, min( f[i].w, x - f[i].x));
        }
        
        return temp;
    }
    int main() {
        int t;
        scanf( "%d", &t );
        while( t-- ) {
            memset(f, 0, sizeof(f));
            ll R;
            scanf( "%lld", &R );
            scanf( "%d", &n );
            
            ll sum = 0;
            for( int i = 0; i < n; i++ ) {
                scanf( "%lld%lld%lld%lld", &f[i].x, &f[i].y, &f[i].w, &f[i].h );
                sum += f[i].w * f[i].h;
            }
            ll l, r;
            l = 0;
            r = R+1;
            ll mid;
            while( l < r ) {
                mid = (l+r)/2;
    //            cout << mid << endl;
                if( 2*fun(mid) < sum ) {
                    l = mid+1;
                }
                else {
                    r = mid;
                }
    //            cout << "===" << endl;
            }
    //        cout << "r: " << r << endl;
            ll ans = fun( r );
            l = 0;
            r = R+1;
            while( l < r ) {
                mid = (l+r) / 2;
                if( fun(mid) <= ans ) {
                    l = mid + 1;
                }
                else {
                    r = mid;
                }
            }
            ll res = l - 1;
            printf( "%lld\n", res );
        }
        return 0;
    }
    View Code

      思考:首先自己的代码能力实在是太差, 虽然能看出来是二分但是实现还是十分的费劲, bug重重, 不多说, 多码。

  • 相关阅读:
    SQL语句——入门级
    使用Java Servlet进行简单登录
    Java简单聊天室
    Java网络编程(二)关于Socket的一些个人想法
    Java网络编程(一)
    Java多线程(三)锁对象和线程池
    Java多线程(二)同步与等待唤醒
    Java多线程(一)初步了解
    IO流(三)其他流与File类
    IO流(二)字符流
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/6827114.html
Copyright © 2020-2023  润新知