• <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>
            隨筆-80  評論-24  文章-0  trackbacks-0
            該問題是一個經典問題,算法導論中的例題。
            題意是有若干個會議要開,每個會議給定開始時間s和結束時間e,其中任意兩個會議i和j,若i的時間和j的時間有重疊(包括邊界相等情況),則認為兩個會議不能同時進行即沖突,現在要問給定若干個會議,求最多能有多少會議不沖突,即最大會議兼容子集的大小。
            標準的貪心算法,可以先按照會議結束時間排序,然后再依次考慮每個會議。算導上的證明非常精彩,強烈建議捧讀。
            簡單來說就是利用了一個定理:
            對于任意非空子問題Sij,其中Sij代表會議i到j的集合,設am是Sij中具有最早結束時間的會議,則會議am在Sij的最大兼容會議子集中被使用。
            其實該定理就是說明為什么按照會議結束時間排序再依次考慮每個會議就能得出最優解。
            該定理是這樣被證明的:設Aij為Sij的最大兼容會議子集,且將Aij中的會議按照結束時間遞增排序。又設ak為Aij的第一個回憶。若ak = am,則定理得證;否則若ak != am,則因為am是Sij中結束時間最早的會議,所以am.finish <= ak.finish,這樣肯定可以構造新的兼容會議子集,Bij = (Aij - ak∪ am。而該子集包含的會議個數是和Aij的會議個數相等的!這就證明了am肯定包含在了Sij的最大兼容會議子集中。
            樣題見
            http://acm.nyist.net/JudgeOnline/problem.php?pid=14
            代碼如下:

             1 #include <cstdio>
             2 #include <cstdlib>
             3 
             4 #define MAX_EVENT 10005
             5 
             6 struct EVENT {
             7   int start;
             8   int finish;
             9 };
            10 
            11 EVENT event[MAX_EVENT];
            12 
            13 static int cmp(const void *a, const void *b) {
            14   EVENT *p = (EVENT *)a;
            15   EVENT *q = (EVENT *)b;
            16   return p->finish > q->finish;
            17 }
            18 
            19 int main() {
            20   int m;
            21   int n;
            22   scanf("%d", &m);
            23   while (m--) {
            24     scanf("%d", &n);
            25     int i;
            26     for (i = 0; i < n; ++i) {
            27       scanf("%d%d", &(event[i].start), &(event[i].finish));
            28     }   
            29     qsort(event, n, sizeof(EVENT), cmp);
            30     int res = 1;
            31     int max_finish = event[0].finish;
            32     for (i = 1; i < n; ++i) {
            33       if (event[i].start > max_finish) {
            34         res++;
            35         max_finish  = event[i].finish;
            36       }   
            37     }   
            38     printf("%d\n", res);
            39   }
            40   return 0;
            41 }

            貪心算法和動態規劃算法是算法領域非常重要的兩類算法,需要好好掌握。
            posted on 2012-09-16 12:32 myjfm 閱讀(1426) 評論(0)  編輯 收藏 引用 所屬分類: 算法基礎
            精品久久久久香蕉网| 久久久久国产精品嫩草影院| 国产精品久久久久久久app| 亚洲?V乱码久久精品蜜桃 | A级毛片无码久久精品免费| 天天综合久久一二三区| 亚洲国产精品成人久久蜜臀| 99久久国产精品免费一区二区| 国内精品久久久久影院薰衣草| 国产亚洲精品美女久久久| 国产农村妇女毛片精品久久| 亚洲伊人久久成综合人影院 | 亚洲?V乱码久久精品蜜桃| 亚洲中文久久精品无码| 精品无码久久久久久国产| 亚洲伊人久久成综合人影院 | 人人狠狠综合久久亚洲88| 日韩美女18网站久久精品| 成人国内精品久久久久一区| 久久久久一级精品亚洲国产成人综合AV区 | 久久夜色精品国产噜噜亚洲AV | 久久久国产精华液| 国产精品久久久久一区二区三区| 久久精品国产亚洲αv忘忧草| 久久91精品久久91综合| 亚洲人成精品久久久久| 久久综合给合综合久久| 99久久国产亚洲高清观看2024 | 91精品日韩人妻无码久久不卡 | 国产香蕉久久精品综合网| 久久综合九色综合97_久久久| 五月丁香综合激情六月久久| 久久久精品波多野结衣| 91精品国产91久久久久久蜜臀 | 色欲av伊人久久大香线蕉影院| 精品久久久久久国产三级| 国内精品久久久人妻中文字幕| 亚洲中文字幕无码久久精品1| 91麻豆国产精品91久久久| 亚洲七七久久精品中文国产| 四虎久久影院|