• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            還沒想好
            怎樣彌補(bǔ)荒廢的青春
            posts - 2,comments - 2,trackbacks - 0
            有兩個(gè)數(shù)組a,b,大小都為n,數(shù)組元素的值任意,無序;
            要求:通過交換a,b中的元素,使數(shù)組a元素的和與數(shù)組b元素的和之間的差最小

            據(jù)說要8分鐘內(nèi)寫出代碼,我試了一下,整出思路都有幾分鐘了,代碼寫出來都快個(gè)把小時(shí)了,自認(rèn)為也寫過那么多年的程序,也不至于那么弱爆吧,難道傳說中的神人就這么厲害?
            代碼貼下面,高手指點(diǎn):
              1 
              2 /*
              3 有兩個(gè)數(shù)組a,b,大小都為n,數(shù)組元素的值任意,無序;
              4 要求:通過交換a,b中的元素,使數(shù)組a元素的和與數(shù)組b元素的和之間的差最小
              5 */
              6 
              7 /*
              8 算法思想就是先把兩堆數(shù)排序,然后給結(jié)果數(shù)組分配,當(dāng)一邊有一個(gè)最大的數(shù)時(shí),
              9 應(yīng)該給它配一個(gè)最小的數(shù),所以一次取兩個(gè)數(shù)。當(dāng)給A組分配最大MAX和最小的MIN后,
             10 再在剩下未分配的數(shù)里取出最大和最小的數(shù)分配給B,直到分完為止。
             11 這個(gè)算法并不能保證最優(yōu)解,正確算法應(yīng)該使用動(dòng)態(tài)規(guī)劃法,以后補(bǔ)上正解的代碼。
             12 */
             13 
             14 //從剩余的數(shù)厘米找出最大的那個(gè)。
             15 //a,b分別是數(shù)組地址,offa和offb是偏移量,是值結(jié)果參數(shù)。
             16 int get_max(int *a, int *offa, int *b, int *offb)
             17 {
             18     if(*offa == 0)
             19     {
             20         (*offb)--;
             21         return b[*offb+1];
             22     }
             23     else if(*offb == 0)
             24     {
             25         (*offa)--;
             26         return a[*offa+1];
             27     }
             28     
             29     if(a[*offa] > b[*offb])
             30     {
             31         (*offa)--;
             32         return a[*offa+1];
             33     }else{
             34         (*offb)--;
             35         return b[*offb+1];
             36     }
             37 }
             38 
             39 //類似get_max,是取最小的數(shù)。
             40 //n是數(shù)組大小。
             41 int get_min(int *a, int *offa, int *b, int *offb, int n)
             42 {
             43     if(*offa == n)
             44     {
             45         (*offb)++;
             46         return a[*offb-1];
             47     }
             48     else if(*offb == n)
             49     {
             50         (*offa)++;
             51         return a[*offa-1];
             52     }
             53     
             54     if(a[*offa] < b[*offb])
             55     {
             56         (*offa)++;
             57         return a[*offa-1];
             58     }else{
             59         (*offb)++;
             60         return a[*offb-1];
             61     }
             62 }
             63 
             64 //這個(gè)就不解釋了吧
             65 void swap_i(int *a, int *b) 
             66 {
             67     int t = *a;
             68     *= *b;
             69     *= t;
             70 }
             71 
             72 //主算法,輸入是a,b兩個(gè)數(shù)組即長度n
             73 //返回交互后兩組數(shù)據(jù)和的差。
             74 //每次從兩組數(shù)據(jù)里取最大和最小的組合起來,放到一邊,次大和次小的放到另一邊
             75 //實(shí)際上這個(gè)算法不能保證找到最優(yōu)解,應(yīng)該使用動(dòng)態(tài)規(guī)劃法來求最優(yōu)解。
             76 int swap_x(int *a, int *b, int n)
             77 {
             78     int sa, sb, la, lb, *na, *nb, idx, delta, d;
             79     na = new int[n];
             80     nb = new int[n];
             81     idx = 0;
             82     delta = 0;
             83     sa = sb = 0;
             84     la = lb = n - 1;
             85     
             86     sort(a, a+n);
             87     sort(b, b+n);
             88     
             89     while(idx < n-1)
             90     {
             91         //先給A和B一邊分配一個(gè)最大的
             92         na[idx] = get_max(a, &la, b, &lb);
             93         nb[idx] = get_max(a, &la, b, &lb);
             94         d = na[idx] - nb[idx];
             95         idx++;
             96         //然后一邊分配一個(gè)最小的
             97         na[idx] = get_min(a, &la, b, &lb, n);
             98         nb[idx] = get_min(a, &la, b, &lb, n);
             99         d += na[idx] - nb[idx];
            100         idx++;
            101         
            102         if(delta > 0 && d > 0)
            103         { //A這邊總和比B的總和大了,然后新的數(shù)又是A這邊大,則需要交換
            104             swap_i(na+idx, nb+idx);
            105             swap_i(na+idx-1, nb+idx-1);
            106             d = -d;
            107         }
            108         delta += d;
            109     }
            110     
            111     //n為奇數(shù),剩下兩個(gè)數(shù)。
            112     if(idx == n-1)
            113     {
            114         if(delta > 0)
            115         { //A總和大,把剩下最后一個(gè)小的給A
            116             na[idx] = get_min(a, &la, b, &lb, n);
            117             nb[idx] = get_max(a, &la, b, &lb);
            118         }else//A總和小,把剩下的大數(shù)給A
            119             na[idx] = get_max(a, &la, b, &lb);
            120             nb[idx] = get_min(a, &la, b, &lb, n);
            121         }
            122     }
            123     
            124     memcpy(a, na, n*sizeof(a[0]);
            125     memcpy(b, nb, n*sizeof(b[0]);
            126     delete [] na;
            127     delete [] nb;
            128     return delta;
            129 }


            posted @ 2012-05-31 09:17 nullpointer 閱讀(234) | 評(píng)論 (2)編輯 收藏
            在程序員這個(gè)職業(yè)上混了十年, 最美好的青春歲月都奉獻(xiàn)給了它,可是卻沒有留下多少輝煌和燦爛的記憶。十年的歲月一晃就過去,仿佛比打醬油還快,其實(shí),這些年真的是在打醬油。。。我知道我不會(huì)繼續(xù)干多久的程序了,可是一旦離開,心中還是有些不舍。一直沒有寫技術(shù)博客的習(xí)慣,現(xiàn)在就當(dāng)一個(gè)空的小本子吧,看看最后會(huì)在上面記錄下點(diǎn)什么。
            posted @ 2012-03-21 14:04 nullpointer 閱讀(159) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題  
            久久精品无码专区免费青青| 久久精品国产清自在天天线| 精品综合久久久久久97| 精品伊人久久久| 97久久精品人妻人人搡人人玩 | 久久97久久97精品免视看秋霞| 日韩一区二区久久久久久 | 欧美日韩久久中文字幕| 亚洲午夜久久久影院| 国产高清美女一级a毛片久久w | 一级做a爰片久久毛片人呢| 久久综合色之久久综合| 久久精品国产亚洲av麻豆色欲| 久久91精品综合国产首页| 久久精品水蜜桃av综合天堂| 久久本道久久综合伊人| 久久精品a亚洲国产v高清不卡| 久久久久亚洲爆乳少妇无 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 精品精品国产自在久久高清| 久久精品国产男包| 久久精品无码一区二区app| 久久综合亚洲欧美成人| 精品国产日韩久久亚洲| 久久九色综合九色99伊人| 97久久精品国产精品青草| 久久精品国产亚洲AV蜜臀色欲| 国产高潮久久免费观看| 久久丫精品国产亚洲av| 77777亚洲午夜久久多喷| 亚洲色欲久久久久综合网 | 欧美与黑人午夜性猛交久久久 | 久久精品国产2020| 思思久久好好热精品国产| 久久久久久A亚洲欧洲AV冫| 久久精品成人免费观看97| 国产日韩久久免费影院 | 久久亚洲精品无码aⅴ大香 | 久久久久99精品成人片三人毛片 | 国产aⅴ激情无码久久| 久久婷婷五月综合色奶水99啪|