中位數題解 c (詳細)

2022-06-02 00:54:09 字數 1208 閱讀 1658

題目是這樣的

題目描述:

給你n個整數ai和乙個整數s,題目資料保證n是奇數。

1次操作可以使n個數中的任意乙個數增加1或者減少1。

你現在的任務是計算出使這n個整數的中位數變為s的最小運算元是多少?

輸入格式:

輸入一共有兩行。

第一行有兩個整數n和s,分別表示整數的個數和題目描述的s的值

第二行包含n個用空格分開的整數,a1,a2,a3,...,an。

輸出格式:

輸出只有乙個整數,表示最小運算元。

這道題我認為有坑

中位數並不是一開始的,在做完一次之後要繼續操作,直到符合條件。不然就是一道水題

我一開始的思路是:先做完一次,再sort,再繼續…………

於是,我就:time limit exceeded

很明顯,我是在作死(不作就不會死)

於是,我找了 cjg 幫忙,自己又琢磨了一會,就解出了這道題

步驟如下:

ac**:

#include

#include

using

namespace std;

long

long n, s, sum =

0, mid;

int a[

2000005];

void

intn()

void

work()

intmain()

#include

#include

using

namespace std;

long

long n, s, sum =

0, mid;

int a[

2000005];

void

intn()

}void

work()

}for

(long

long i =

1; i <= mid; i++)}

}int

main()

謝謝閱讀!

題解 中位數

傳送門 首先考慮的是二叉搜尋樹,每次查詢當前排名 i 1 2的數。但是對於某些資料,其遞迴層數過多,會導致爆棧。那麼顯然可以用treap或splay。這裡考慮線段樹 由於線段樹是一種平衡樹,所以一定保證能跑出來。對於線段樹,我們基於二叉搜尋樹的查詢方法並介於線段樹平衡的性質求解。對於線段樹的每乙個節...

中位數的中位數

參照王曉東的演算法設計 中位數的中位數,即將一串數分成n段,求其排好序了的中間那個數,再把這些所有中位數再求一次中位數。for int i 0 i r p 4 5 i 找中位數的中位數,r p 4即上面所說的n 5 int x lineselect a,p,p r p 4 5,r p 4 10 線性...

中位數題解 luogu P1627

給出1 n的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是b。中位數是指把所有元素從小到大排列後,位於中間的數。輸入格式 第一行為兩個正整數n和b,第二行為1 n的排列。輸出格式 輸出乙個整數,即中位數為b的連續子串行個數。輸入樣例1 7 4 5 7 2 4 3 1 6 輸出樣例1 資...