MIN,MAX,MEAN,MEDIAN——從一道編程題說起

原題來自Google CodeJam 2017 Round C的第四題4M Corporation,大意如下:

給定四個(gè)正整數(shù)MIN,MAX,MEAN,MEDIAN,求:
至少需要多少個(gè)數(shù),才可以滿足最小值為MIN,最大值為MAX,均值為MEAN,中位數(shù)為MEDIAN?
如果存在可行的解,給出最少需要的數(shù)的個(gè)數(shù)n;如果不存在,則輸出IMPOSSIBLE。

簡(jiǎn)單的無解情形

首先,我們可以簡(jiǎn)單地排除掉一些無解的情形:

  • MIN > MAX
  • MEAN < MIN
  • MEAN > MAX
  • MEDIAN < MIN
  • MEDIAN > MAX

這樣,我們可以保證下式成立
MIN\leq MEDIAN, MEAN \leq MAX

簡(jiǎn)單的有解情形

在上面的條件下,我們很容易找到兩種特殊情形:

  1. MIN=MEAN=MEDIAN=MAX,此時(shí)n=1,只需要一個(gè)數(shù){MIN}
  2. MEAN=MEDIAN=1/2(MIN+MAX),此時(shí)n=2,只需要兩個(gè)數(shù){MIN,MAX}

一般情形

如果不滿足上面的簡(jiǎn)單有解情形,我們至少需要3個(gè)數(shù)才有可能滿足條件,也即n\geq 3

那么,接下來如何進(jìn)行呢?

我們需要對(duì)一組數(shù)的MIN、MAX、MEAN、MEDIAN之間的關(guān)系進(jìn)行更加深入的觀察。
因?yàn)橹形粩?shù)在數(shù)的個(gè)數(shù)為奇數(shù)和偶數(shù)時(shí)有不同的表達(dá)形式,這啟發(fā)我們對(duì)奇偶進(jìn)行分別討論。

奇數(shù)情形

先看奇數(shù)n=2k+1\ (k\geq 1)的情形。
我們把2k+1個(gè)數(shù)從小到大排列并求和,可以得到如下的關(guān)系式:

MIN+\underbrace{\cdots}_{k-1個(gè)數(shù)}+MEDIAN+\underbrace{\cdots}_{k-1個(gè)數(shù)}+MAX=(2k+1)\cdot MEAN

考慮大小關(guān)系,我們可以得到下面的不等式:

\begin{aligned} & MIN+\underbrace{MIN+\cdots+MIN}_{k-1個(gè)}+MEDIAN+\underbrace{MEDIAN+\cdots+MEDIAN}_{k-1個(gè)}+MAX \\ \leq & (2k+1)\cdot MEAN \\ \leq & MIN+\underbrace{MEDIAN+\cdots+MEDIAN}_{k-1個(gè)}+MEDIAN+\underbrace{MAX+\cdots+MAX}_{k-1個(gè)}+MAX\\ \end{aligned}

也即:

k\cdot MIN + k\cdot MEDIAN + MAX\leq (2k+1)\cdot MEAN \leq MIN+k\cdot MEDIAN+k\cdot MAX

現(xiàn)在MIN、MAX、MEAN、MEDIAN都已知,這意味著我們可以直接求解這個(gè)關(guān)于k的不等式,從而得到:

\left\{ \begin{aligned} & k \geq \frac{MAX-MEAN}{2*MEAN-MIN-MEDIAN} \\ & k \geq \frac{MEAN-MIN}{MAX+MEDIAN-2*MEAN} \\ \end{aligned} \right.

從而得到

k_o=\max(\left\lceil \frac{MAX-MEAN}{2*MEAN-MIN-MEDIAN}\right\rceil, \left\lceil \frac{MEAN-MIN}{MAX+MEDIAN-2*MEAN}\right\rceil)

我們把奇數(shù)情形下的解記為n_o=2k_o+1

注意,由于k必定為正整數(shù),當(dāng)2*MEAN-MIN-MEDIAN \leq 0MAX+MEDIAN-2*MEAN \leq 0時(shí),不等式無解。

偶數(shù)情形

接下來,再考慮n=2k (k\geq 2)的情形,類似奇數(shù)的情形,我們可以得到:

MIN+\underbrace{\cdots}_{k-2個(gè)數(shù)}+MEDIAN+MEDIAN+\underbrace{\cdots}_{k-2個(gè)數(shù)}+MAX=2k\cdot MEAN

進(jìn)而得到不等式:

\begin{aligned} & MIN+\underbrace{MIN+\cdots+MIN}_{k-2個(gè)}+MEDIAN+MEDIAN+\underbrace{MEDIAN+\cdots+MEDIAN}_{k-2個(gè)}+MAX \\ \leq & 2k\cdot MEAN \\ \leq & MIN+\underbrace{MEDIAN+\cdots+MEDIAN}_{k-2個(gè)}+MEDIAN+MEDIAN+\underbrace{MAX+\cdots+MAX}_{k-2個(gè)}+MAX\\ \end{aligned}

這里,為什么中間的兩個(gè)數(shù)都設(shè)置為MEDIAN,而不是MEDIAN-1MEDIAN+1,或者其他組合呢?
從上面的不等式,我們很容易看到,如果中間兩個(gè)數(shù)設(shè)置成MEDIAN-t,MEDIAN+t,則不等式左端會(huì)增大,而不等式右端會(huì)減小,這樣就縮小了解的范圍。

整理得到:

(k-1)\cdot MIN + k\cdot MEDIAN + MAX\leq 2k\cdot MEAN \leq MIN+k\cdot MEDIAN+(k-1)\cdot MAX

同樣地,求解上面的不等式,我們可以得到:

k_e=\max(\left\lceil \frac{MAX-MIN}{2*MEAN-MIN-MEDIAN}\right\rceil, \left\lceil \frac{MAX-MIN}{MAX+MEDIAN-2*MEAN}\right\rceil)

不等式無解的條件與奇數(shù)情形一致。所以,2*MEAN-MIN-MEDIAN \leq 0MAX+MEDIAN-2*MEAN \leq 0時(shí),原問題無解(這里的前提是n=1n=2時(shí)兩種簡(jiǎn)單解均不成立)。

偶數(shù)情形下的解,我們記為n_e=2k_e

顯然,最后的解n=\min(n_o,n_e),到這里,我們也就圓滿地解決了上面的問題。

如果去掉題目中的正整數(shù)限制,這一解法同樣成立。

思考

在上面解題的過程中,我們發(fā)現(xiàn)了2*MEAN-MIN-MEDIAN \leq 0MAX+MEDIAN-2*MEAN \leq 0時(shí)會(huì)導(dǎo)致無解,那么反過來,我們就可以得到有解時(shí),關(guān)于MEAN的不等式:

\frac{1}{2}(MIN+MEDIAN)<MEAN<\frac{1}{2}(MEDIAN+MAX)

其中MIN<MAX

原問題有解,意味著這樣的一組數(shù)是有可能存在的,而原問題無解,則說明這樣的一組數(shù)不可能存在。這就意味著,我們得出的原問題有解的條件,應(yīng)當(dāng)是任意n個(gè)滿足MIN<MAX的實(shí)數(shù)的固有性質(zhì)。

下面我們從數(shù)學(xué)上證明\frac{1}{2}(MIN+MEDIAN)\frac{1}{2}(MEDIAN+MAX)分別是MEAN的下確界和上確界。

我們還是分奇數(shù)和偶數(shù)兩種情況來考慮這一問題。

奇數(shù)情形

令函數(shù)f(k)=\frac{k\cdot MIN + k\cdot MEDIAN + MAX}{2k+1},其中k\geq 1

對(duì)f(k)求導(dǎo),得到

f'(k)=\frac{MIN+MEDIAN-2\cdot MAX}{(2k+1)^2}<0

因此f(k)單調(diào)遞減。

接下來,我們需要求f(k)的極限\lim _{k\rightarrow\infty}f(k),根據(jù)洛必達(dá)法則,易得\lim _{k\rightarrow\infty}f(k)=\frac{1}{2}(MIN+MEDIAN)。
由于

\forall k, MEAN\geq f(k)

也就證明了\frac{1}{2}(MIN+MEDIAN)就是MEAN的下確界。

同樣,令g(k)=\frac{MIN + k\cdot MEDIAN + k\cdot MAX}{2k+1}

g'(k)=\frac{MAX+MEDIAN-2\cdot MIN}{(2k+1)^2}>0

因此g(k)單調(diào)遞增,并且\lim_{k\rightarrow\infty}g(k)=\frac{1}{2}(MEDIAN+MAX)。

由于

\forall k, MEAN\leq g(k)

我們得到\frac{1}{2}(MAX+MEDIAN)MEAN的上確界。

偶數(shù)情形

證明方法同上。

總結(jié)

綜合奇數(shù)和偶數(shù)的情形,我們也就證明了對(duì)于任意n個(gè)數(shù),當(dāng)MIN<MAX成立時(shí),必然有

\frac{1}{2}(MIN+MEDIAN)<MEAN<\frac{1}{2}(MAX+MEDIAN)

Q.E.D

附:源程序

#include <algorithm>
#include <iostream>
#include <cmath>

using namespace std;

void solve(int case_num) {
  int MIN, MAX, MEAN, MEDIAN;
  int count{0};
  cin >> MIN >> MAX >> MEAN >> MEDIAN;

  // 簡(jiǎn)單的無解情形
  if (
    MIN > MAX ||
    MEAN > MAX ||
    MEAN < MIN ||
    MEDIAN > MAX ||
    MEDIAN < MIN
    ) {
    cout << "Case #" << case_num << ": " << "IMPOSSIBLE" << endl;
    return;
  }

  // 簡(jiǎn)單的有解情形
  if (MIN == MAX) count = 1;
  else if (MIN + MAX == 2 * MEAN && MEAN == MEDIAN) count = 2;
  else {
    // 不等式無解的情形
    if (2 * MEAN >= MEDIAN + MAX || 2 * MEAN <= MIN + MEDIAN) {
      cout << "Case #" << case_num << ": " << "IMPOSSIBLE" << endl;
      return;
    }

    // 偶數(shù)情形
    int left = ceil((double) (MAX - MIN) / (2 * MEAN - MIN - MEDIAN));
    int right = ceil((double) (MAX - MIN) / (MAX + MEDIAN - 2 * MEAN));
    int k = max(left, right);
    int even = 2 * k;

    // 奇數(shù)情形
    left = ceil((double) (MAX - MEAN) / (2 * MEAN - MIN - MEDIAN));
    right = ceil((double) (MEAN - MIN) / (MAX + MEDIAN - 2 * MEAN));
    k = max(left, right);
    int odd = 2 * k + 1;
    count = min(even, odd);
  }

  cout << "Case #" << case_num << ": " << count << endl;
}

int main() {
  int t;
  cin >> t;
  for (int i = 1; i <= t; ++i) {
    solve(i);
  }
  return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 小學(xué)奧數(shù)其實(shí)很簡(jiǎn)單,以下是這六個(gè)部分的知識(shí)點(diǎn)! 1 第一部分(知識(shí)點(diǎn)1-6) 2、年齡問題的三個(gè)基本特征: ①兩個(gè)...
    小一哥閱讀 1,430評(píng)論 0 3
  • 第一章數(shù)和數(shù)的運(yùn)算 一概念 (一)整數(shù) 1整數(shù)的意義 自然數(shù)和0都是整數(shù)。 2自然數(shù) 我們?cè)跀?shù)物體的時(shí)候,用來表示...
    meychang閱讀 2,844評(píng)論 0 5
  • 你的數(shù)學(xué)直覺怎么樣?你能憑借直覺,迅速地判斷出誰的概率大,誰的概率小嗎?下面就是 26 個(gè)這樣的問題。如果你感興趣...
    cnnjzc閱讀 7,466評(píng)論 0 12
  • “云想衣裳花想容”,“女人的衣櫥里總是缺少一件衣服”,金星說,“旗袍就是我的戰(zhàn)袍”。穿對(duì)衣服說對(duì)話,穿對(duì)衣服體現(xiàn)女...
    一盞熱茶閱讀 584評(píng)論 2 2
  • 新精英的《個(gè)人戰(zhàn)略》課程進(jìn)入了第二個(gè)模塊---個(gè)人對(duì)標(biāo),要將對(duì)標(biāo)人物挖地三尺,找出我與他的相似點(diǎn)與借鑒點(diǎn)。 第一次...
    效對(duì)職場(chǎng)閱讀 635評(píng)論 0 3

友情鏈接更多精彩內(nèi)容