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\n", m);
    return 0;
 }
时间: 2024-10-29 04:32:20

SGU 114. Telecasting station 三分or找中位数的相关文章

数学 + 带权中位数 - SGU 114 Telecasting station

Telecasting station Problem's Link Mean: 百慕大的每一座城市都坐落在一维直线上,这个国家的政府决定建造一个新的广播电视台. 经过了许多次试验后,百慕大的科学家们提出了一个结论:在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视台的距离的乘积. 你需要找到这个一维直线上的一点来建造广播电视台,使得所有城市的不满意度的和最小. analyse: 个人觉得应该是加权平均数,然而却是求中位数. 可以这样想:随便挑一个点作为station,左右移动一下看看

SGU[114] Telecasting station

Description 描述 Every city in Berland is situated on Ox axis. The government of the country decided to build new telecasting station. After many experiments Berland scientists came to a conclusion that in any city citizens displeasure is equal to prod

SGU 114

分析得,选取的电视塔的位置应当位于各城市的加权中位数位置的右边最近的城市位置. 理由:对于上述位置A,假设它右边城市+它本身的人数为rp,它左边城市的人数为lp,由定义rp>=lp. 所以,如果向左移动D距离,则右边城市不满意度增加D*rp,左边减少D*lp<=D*rp,不合算. 同理,向右移动D距离时,同样有D*rp<=D*lp,不合算. 所以,上述位置为最佳位置. 输出时应注意输出格式:有五位小数. #include "stdio.h" #include &quo

有序数组中找中位数

问题描述 给定两个有序数组,返回这两个数组的中位数.如果中位数有两个,则返回它们的平均值. e.g. [1, 3, 5]和[2, 4, 6]的中位数是3.5 解决思路 如果两个数组的长度之和为奇数,则中位数有一个:否则中位数为其中两个的平均值. 从两个数组中找第k个数,可以使用递归的思路. 程序 首先,写出在有序数组a和b中找到第k大的程序: 1. 利用归并排序中的merge数组方法,时间复杂度为O(k). public int findKthNaive(int[] a, int[] b, in

D. Salary Changing(找中位数)

题:https://codeforces.com/contest/1251/problem/D 题意:给你n个单位需要满足达到的区间,再给个s,s是要分配给n的单位的量,当然∑l<=s,问经过分配后能够达到的最大中位数是多少 题解:二分找中位数,成立原因:代码注释 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define fo(i,a,b) for(int i=a;i<=b;i++) #de

LeetCode Median of Two Sorted Arrays 找中位数(技巧)

题意: 给两个有序(升or降)的数组,求两个数组合并之后的中位数. 思路: 按照找第k大的思想,很巧妙.将问题的规模降低,对于每个子问题,k的规模至少减半. 考虑其中一个子问题,在两个有序数组中找第k大,我们的目的只是将k的规模减半而已,所以可以对比nums1[k/2]和nums2[k/2]的大小,假设nums1[k/2]<=nums2[k/2],那么nums1[0~k/2]这部分必定在0~k之中,那么将这部分删去,k减半,再递归处理.这里面可能有一些细节问题要考虑: 1. 如果其中1个数组的大

找中位数O(n)算法

题目描写叙述: 给定一个未排序的整数数组,找到当中位数. 中位数是排序后数组的中间值,假设数组的个数是偶数个.则返回排序后数组的第N/2个数. 例子 给出数组[4, 5, 1, 2, 3], 返回 3 给出数组[7, 9, 4, 5],返回 5 解题思路: 利用快排划分的思想,递归处理. 參考代码: <span style="font-size:18px;">public class Solution { public int median(int[] nums) { re

找中位数

题目描述 中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数 (或最中间两个数据的平均数). 给出一组无序整数,求出中位数,如果求最 中间两个数的平均数,向下取整即可(不需要使用浮点数) 输入描述: 该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据 包含的数据个数,1<=N<=10000. 接着N行为N个数据的输入,N=0时结束输入 输出描述: 输出中位数,每一组测试数据输出一行 #include <iostream> using namespa

[LeetCode] Find Median from Data Stream 找出数据流的中位数

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. Examples: [2,3,4] , the median is 3 [2,3], the median is (2 + 3) / 2 = 2.5 Design a d