題目是這樣的
題目描述:
給你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 資...