• SGU 114. Telecasting station 三分or找中位数


    题目链接点这儿

    一開始想都没想。。。直接上了三分。。。结果。。。sample的答案不一样。。。可是过了。。。然后又看了看。

    发现这不就是高中或者初中出过的求中位数的题么。

    。直接找到这些的中位数即可了。。。。假设某一点处人口不止一个。那就把它拆成一个一个的点。

    然后求中位数。

    嗯。。。

    这题就结束了。


    至于三分的过程,事实上就是二分略微改进的版本号。二分仅仅能求单调的函数,假设函数在定义域内不是单调的,那么二分就失效了。当然。

    。。这时能够用数学上的无穷分逼近,通过分成若干小段逐个二分求区间最值,最后找最大值。

    只是有一种现成的算法来解决定义域内为凹函数或者凸函数(即单峰函数。定义域内仅仅有一个极值点)。

    二分中用到了3个量,begin, medium, end。而三分则是由加了一个r_medium = (medium + end)/2。

    这样。每次切割后。不是比較的medium和begin或者end的大小,由于最值不会在某个区间的端点处出现。而是比較medium和r_medium的大小。假设medium比較靠近极值,那么便舍弃r_medium到end这一段,反之则舍弃begin到medium这一段。这样,每次舍去的都是离极值较远的一段,从而保证了每次都没有将极值丢掉。


    比方这个就会舍弃掉begin到medium这一段,非常明显,极值所在区间并没有舍去

    这样重复比較,区间就会越来与靠近极值,这时的medium就可近似觉得是所求的极值了


    偷懒就把三分的代码放上来了。。。求中位数的过程也没有什么难点。。。

    #include <bits/stdc++.h>
    #define max(a,b) ((a)>(b))?(a):(b)
    #define min(a,b) ((a)>(b))?(b):(a)
    #define rep(i,initial_n,end_n) for(int (i)=(initial_n);(i)<(end_n);i++)
    #define repp(i,initial_n,end_n) for(int (i)=(initial_n);(i)<=(end_n);(i)++)
    #define eps 1.0E-8
    #define MAX_N 1010
    #define INF 1 << 30
    using namespace std;
    typedef pair<int, int> pii;
    typedef pair<double, double> pdd;
    typedef long long ll;
    typedef unsigned long long ull;
    
    pii a[15010];
    
     int main() {
        int n;
        scanf("%d", &n);
        int minn = INT_MAX, maxx = INT_MIN;
        rep(i, 0, n) {
            scanf("%d%d", &a[i].first, &a[i].second);
            if(minn > a[i].first) minn = a[i].first;
            if(maxx < a[i].first) maxx = a[i].first;
        }
        double b = minn, e = maxx, m = (b+e)/2, mm = (m+e)/2;
        while(b - e < -eps) {
            double tmp = 0, tmpp = 0;
            rep(i, 0, n) {
                tmp += fabs(a[i].first - m) * 1.0 * a[i].second, tmpp += fabs(a[i].first - mm) * 1.0 * a[i].second;
            }
            if(tmp - tmpp < -eps) e = mm;
            else b = m;
            m = (b+e)/2, mm = (m+e)/2;
        }
        printf("%f
    ", m);
        return 0;
     }
    


  • 相关阅读:
    HDU 6043 KazaQ's Socks
    HDU 6033 Add More Zero
    D
    D
    L
    关于G
    excel函数实现下拉框控制显示不同内容
    牛客网暑期ACM多校训练营(第五场)J-plan (模拟)
    牛客网暑期ACM多校训练营(第五场)G-max (math)
    牛客网暑期ACM多校训练营(第五场)A-gap (二分答案)
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6747806.html
Copyright © 2020-2023  润新知