分治

什么是分治算法呢? 對于一個規(guī)模為n的問題,若該問題可以容易地解決(比如說規(guī)模n較小)隘弊,則直接解決,否則將其分解為k個規(guī)模較小的子問題荒适,這些子問題互相獨立且與原問題形式相同梨熙,遞歸地解這些子問題, 然后將各子問題的解合并刀诬,得到原問題的解咽扇。這種算法設(shè)計策略叫做分治法(divide and conquer)。

分治算法引用的條件

①該問題可以分解成若干相互獨立、規(guī)模較小的相同子問題质欲;

②子問題縮小到一定的程度就能輕易得到解树埠;

③子問題的解合并后,能得到原問題的解嘶伟;

分治法三步:
(1) 劃分(divide):將原問題分解為若干規(guī)模較小怎憋、 相互獨立、 與原問題形式相同的子問題九昧。

(2) 解決(conquer): 若子問題規(guī)模較小绊袋,則直接求解;否則遞歸求解各子問題铸鹰。

(3) 合并(combine): 將各子問題的解合并為原問題的解癌别。

if(問題不可分)
     { 直接求解;
        返回問題的解蹋笼;
     }
else {
           對原問題進行分治规个;
           遞歸對每一個分治的部分求解;
           歸并整個問題,得出全問題的解姓建;
        }

例題:給n個實數(shù)诞仓,求它們之中最大值和最小值,要求比較次數(shù)盡量小速兔。

使用分治的方法解決思路:
首先這是一個問題n的題墅拭,當(dāng)n=1時,最大值與最小時不用求涣狗,就是數(shù)本身谍婉,當(dāng)n=2時,最大最小直接比較可以求得镀钓。
那么我們可以將數(shù)據(jù)進行分割為只有兩個元素的可求狀態(tài)穗熬,最后再將其合并。

 public static void main(String[] args) {
        int[] seq = {1,5,6,9,5,2,9,10,18,3};
        Main main = new Main();
        int end = seq.length - 1;
        int[] res = main.DC_maxmin(seq,0,end);
        for (int a :res) {
            System.out.println(a);
        }

    }

    public int[] setTwo(int a , int b) {
        int[] res = new int[2];
        //保證這個集合中的數(shù)值一定是前小后大
        if (a > b) {
            res[0] = b;
            res[1] = a;
        } else {
            res[0] = a;
            res[1] = b;
        }
        return res;
    }
    public int[] DC_maxmin(int[] seq,int start,int end){
        //如果序列中只有一個元素
        if(end-start==0){
            return setTwo(seq[start],seq[start]);
        }
        else if(end-start==1){
            return setTwo(seq[start],seq[end]);
        }else {
            //否則進行迭代切分
            int[] left_seq = DC_maxmin(seq, start, (start + end) / 2);
            int[] right_seq = DC_maxmin(seq, (start + end) / 2 + 1, end);
            int[] res = new int[2];
            
            if(left_seq[0]<right_seq[0]){
                res[0] = left_seq[0];
            }else{
                res[0] = right_seq[0];
            }

            if(left_seq[1]<right_seq[1]){
                res[1] = right_seq[1];
            }else{
                res[1] = left_seq[1];
            }
            return res;
        }

    }

把一個包含n個正整數(shù)的序列劃分成m個連續(xù)的子序列(每個正整數(shù)恰好屬于一個序列)丁溅。設(shè)第i個序列的各數(shù)之和為S(i)唤蔗,你的任務(wù)是讓所有的S(i)的最大值盡量小。例如序列1 2 3 2 5 4劃分成3個序列的最優(yōu)方案為1 2 3|2 5|4窟赏,其中S(1)=6妓柜,S(2)=7,S(3)=4涯穷,最大值為7棍掐;如果劃分成1 2|3 2|5 4,則最大值為9拷况;不如剛才的好作煌。n<=106掘殴,所有數(shù)字之和不超過109。

#include <cstdio>
int prime[664590];
bool check[10000102];
int process(int N) {
    int tot = 0;
    for(int i=2 ; i<=N ; ++i){
        if (! check[i]) prime[tot++] = i;
        for(int j=0 ; j<tot ; j++) {
            if(i * prime[j] > N) break;
            check [i * prime[j]] = true;
            if(i % prime[j] == 0) break;
        }
    }
    return tot;
}
int main() {
    process(10000020);
    int n, tmp;
    scanf("%d", &n);
    while (n--) {
        scanf("%d", &tmp);
        if (tmp <= 2) puts("2");
        else {
            int l = 0, r = 664579, mid;
            while (l < r) {
                mid = l + r >> 1;
                if (prime[mid] >= tmp) r = mid;
                else l = mid + 1;
            }
            if (tmp - prime[l - 1] < prime[l] - tmp) printf("%d\n", prime[l - 1]);
            else printf("%d\n", prime[l]);
        }
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粟誓,一起剝皮案震驚了整個濱河市杯巨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌努酸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杜恰,死亡現(xiàn)場離奇詭異获诈,居然都是意外死亡,警方通過查閱死者的電腦和手機心褐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門舔涎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逗爹,你說我怎么就攤上這事亡嫌。” “怎么了掘而?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵挟冠,是天一觀的道長。 經(jīng)常有香客問我袍睡,道長知染,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任斑胜,我火速辦了婚禮控淡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘止潘。我一直安慰自己掺炭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布凭戴。 她就那樣靜靜地躺著涧狮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪么夫。 梳的紋絲不亂的頭發(fā)上勋篓,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音魏割,去河邊找鬼譬嚣。 笑死,一個胖子當(dāng)著我的面吹牛钞它,可吹牛的內(nèi)容都是我干的拜银。 我是一名探鬼主播殊鞭,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尼桶!你這毒婦竟也來了操灿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤泵督,失蹤者是張志新(化名)和其女友劉穎趾盐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體小腊,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡救鲤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秩冈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片本缠。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖入问,靈堂內(nèi)的尸體忽然破棺而出丹锹,到底是詐尸還是另有隱情,我是刑警寧澤芬失,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布楣黍,位于F島的核電站,受9級特大地震影響棱烂,放射性物質(zhì)發(fā)生泄漏锡凝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一垢啼、第九天 我趴在偏房一處隱蔽的房頂上張望窜锯。 院中可真熱鬧,春花似錦芭析、人聲如沸锚扎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驾孔。三九已至,卻和暖如春惯疙,著一層夾襖步出監(jiān)牢的瞬間翠勉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工霉颠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留对碌,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓蒿偎,卻偏偏與公主長得像朽们,于是被迫代替她去往敵國和親怀读。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一骑脱、基本概念 在計算機科學(xué)中菜枷,分治法是一種很重要的算法。字面上的解釋是“分而治之”叁丧,就是把一個復(fù)雜的問題分成兩個或...
    扎Zn了老Fe閱讀 767評論 0 1
  • 分治策略 本文包括分治的基本概念二分查找快速排序歸并排序找出偽幣棋盤覆蓋最大子數(shù)組 源碼鏈接:https://gi...
    廖少少閱讀 1,850評論 0 7
  • 貪心算法 貪心算法總是作出在當(dāng)前看來最好的選擇啤誊。也就是說貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上...
    fredal閱讀 9,231評論 3 52
  • https://www.cnblogs.com/steven_oyj/archive/2010/05/22/174...
    麒麟楚莊王閱讀 573評論 0 0
  • 對投資者的兩條建議:第一拥娄,不要過于看重某一年的利潤蚊锹;第二,如果你確實關(guān)注短期利潤条舔,請當(dāng)心每股利潤數(shù)據(jù)中存在的陷阱。...
    manofmountain閱讀 423評論 0 0