青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評(píng)論-24  文章-0  trackbacks-0
我們經(jīng)常會(huì)遇到這樣一類問(wèn)題,比如有一些物品,每個(gè)物品都有兩個(gè)屬性,其中每個(gè)屬性都是可比的,比如我們有一摞圓形燒餅,每個(gè)燒餅有直徑和重量?jī)蓚€(gè)屬性,且這兩個(gè)屬性不相關(guān)。那么我們?nèi)绾螌⑦@些燒餅分成盡量少的堆,使得每堆燒餅都可以滿足質(zhì)量和直徑均單調(diào)增(或者單調(diào)減)?
首先直觀的想法是第一步肯定得按照質(zhì)量(或者直徑,均可)從小到大排序。排序完成之后質(zhì)量已經(jīng)滿足要求了,但是直徑并不一定也按照遞增排好序了。該如何將該按質(zhì)量排好序的序列分成最少數(shù)量的若干個(gè)子序列,使得子序列能夠同時(shí)按照直徑遞增排列?
這時(shí)候Dilworth定理就派上用場(chǎng)了。
Dilworth定理大概意思是說(shuō):對(duì)于一個(gè)偏續(xù)集(X,<=),其最少鏈劃分?jǐn)?shù)等于其最長(zhǎng)反鏈的長(zhǎng)度。其中鏈的意思是滿足a1<=a2<=a3<=...<=ai的i個(gè)偏序集中的元素。這里的<=并不一定是小于等于的意思,只是表達(dá)的是一種偏序關(guān)系。
Dilworth定理的證明就不說(shuō)了,網(wǎng)上有現(xiàn)成的證明。
下面說(shuō)說(shuō)利用Dilworth定理來(lái)解決上面提到的問(wèn)題。
心急的C小加問(wèn)題摘自http://acm.nyist.net/JudgeOnline/problem.php?pid=236 
該問(wèn)題和上面提到的燒餅問(wèn)題類似,只不過(guò)改成了木棒,它要求將一堆木棒分成最少的堆數(shù),使得每小堆木棒都能夠按照長(zhǎng)度和質(zhì)量均遞增的順序排列。典型的Dilworth定理問(wèn)題。
其實(shí)講木棒按照長(zhǎng)度遞增排列之后,對(duì)質(zhì)量的處理就成了尋找最長(zhǎng)遞減子序列的問(wèn)題了。該問(wèn)題有O(nlogn)的解法,不過(guò)先看O(n2)的解法:

 1 #include <cstdio>                                                                  
 2 #include <cstring>                                                                 
 3 #include <cstdlib>                                                                 
 4                                                                                    
 5 #define MAX 5005                                                                   
 6                                                                                    
 7 typedef struct {                                                                   
 8   int weight;                                                                      
 9   int length;                                                                      
10 }STICK;                                                                            
11                                                                                    
12 STICK sticks[MAX];                                                                 
13 //cur_maxlen_include_i[i]代表包含元素sticks[i].length的遞減子序列的長(zhǎng)度            
14 int cur_maxlen_include_i[MAX];                                                     
15 //cur_max_minelem[i]代表長(zhǎng)度為i的遞減子序列的最小元素的最大值                      
16 int cur_max_minelem[MAX];                                                          
17                                                                                    
18 int cmp(const void *a, const void *b) {                                            
19   STICK *x = (STICK *)a;                                                           
20   STICK *y = (STICK *)b;                                                           
21   if (x->length != y->length) {                                                    
22     return x->length - y->length;                                                  
23   } else {                                                                         
24     return x->weight - y->weight;                                                  
25   }                                                                                
26 }                                                                                  
27                                                                                    
28 int main() {
29   int T;                                                                           
30   scanf("%d", &T);                                                                 
31   while (T--) {
32     int N;                                                                         
33     int i, j;                                                                   
34     scanf("%d", &N);                                                            
35     for (i = 0; i < N; ++i) {                                                   
36       scanf("%d%d", &(sticks[i].length), &(sticks[i].weight));                  
37     }                                                                           
38     qsort(sticks, N, sizeof(STICK), cmp);                                       
39                                                                                 
40     //求最長(zhǎng)遞減子序列                                                          
41     memset(cur_maxlen_include_i, 0, sizeof(int) * MAX);                         
42     memset(cur_max_minelem, 0, sizeof(int) * MAX);                              
43                                                                                 
44     cur_maxlen_include_i[0] = 1;                                                
45     cur_max_minelem[1] = sticks[0].weight;                                      
46                                                                                 
47     int cur_maxlen = 1;                                                         
48     for (i = 1; i < N; ++i) {                                                   
49       cur_maxlen_include_i[i] = 1;                                              
50       for (j = cur_maxlen; j > 0; --j) {                                        
51         if (cur_max_minelem[j] > sticks[i].weight) {                            
52           cur_maxlen_include_i[i] = j + 1;                                      
53           break;                                                                
54         }                                                                       
55       }                                                                         
56       if (cur_maxlen_include_i[i] > cur_maxlen) {                               
57         cur_maxlen = cur_maxlen_include_i[i];                                   
58         cur_max_minelem[cur_maxlen] = sticks[i].weight;                         
59       } else if (cur_max_minelem[cur_maxlen_include_i[i]] < sticks[i].weight) { 
60         cur_max_minelem[cur_maxlen_include_i[i]] = sticks[i].weight;            
61       }
62     }                                                                           
63     printf("%d\n", cur_maxlen);                                                 
64   }                                                                             
65   return 0;                                                                     
66 }

該程序提交后運(yùn)行時(shí)間為228ms
接下來(lái)是采用二分加速來(lái)查找最長(zhǎng)遞減子序列,程序如下:

 1 #include <cstdio>                                                               
 2 #include <cstring>                                                              
 3 #include <cstdlib>                                                              
 4                                                                                 
 5 #define MAX 5005                                                                
 6                                                                                 
 7 typedef struct {                                                                
 8   int weight;                                                                   
 9   int length;                                                                   
10 }STICK;                                                                         
11                                                                                 
12 STICK sticks[MAX];                                                              
13 //cur_maxlen_include_i[i]代表包含元素sticks[i].length的遞減子序列的長(zhǎng)度         
14 int cur_maxlen_include_i[MAX];                                                  
15 //cur_max_minelem[i]代表長(zhǎng)度為i的遞減子序列的最小元素的最大值                   
16 int cur_max_minelem[MAX];                                                       
17                                                                                 
18 int cmp(const void *a, const void *b) {                                         
19   STICK *x = (STICK *)a;                                                        
20   STICK *y = (STICK *)b;                                                        
21   if (x->length != y->length) {                                                 
22     return x->length - y->length;                                               
23   } else {                                                                      
24     return x->weight - y->weight;                                               
25   }                                                                             
26 }                                                                               
27                                                                                 
28 int main() {                          
29   int T;                                                                        
30   scanf("%d", &T);                                                              
31   while (T--) {                                                                 
32     int N;                                                                      
33     int i, j;                                                                   
34     scanf("%d", &N);                                                            
35     for (i = 0; i < N; ++i) {                                                   
36       scanf("%d%d", &(sticks[i].length), &(sticks[i].weight));                  
37     }                                                                           
38     qsort(sticks, N, sizeof(STICK), cmp);
39                                                                                 
40     //求最長(zhǎng)遞減子序列                                                          
41     memset(cur_maxlen_include_i, 0, sizeof(int) * MAX);                         
42     memset(cur_max_minelem, 0, sizeof(int) * MAX);                              
43                                                                                 
44     cur_maxlen_include_i[0] = 1;                                                
45     cur_max_minelem[1] = sticks[0].weight;                                      
46                                                                                 
47     int cur_maxlen = 1;                                                         
48     for (i = 1; i < N; ++i) {
49       cur_maxlen_include_i[i] = 1;                                              
50       int low = 1;                                                              
51       int high = cur_maxlen;                                                    
52       while (low < high - 1) {                                                  
53         int mid = (low + high) >> 1;                                            
54         if (cur_max_minelem[mid] > sticks[i].weight) {                          
55           low = mid;                                                            
56         } else {                                                                
57           high = mid;                                                           
58         }                                                                       
59       }                                                                         
60       if (cur_max_minelem[low] > sticks[i].weight) {                            
61         cur_maxlen_include_i[i] = low + 1;                                      
62       }                                                                         
63       if (cur_max_minelem[high] > sticks[i].weight) {                           
64         cur_maxlen_include_i[i] = high + 1;                                     
65       }                                                                         
66       if (cur_maxlen_include_i[i] > cur_maxlen) {                               
67         cur_maxlen = cur_maxlen_include_i[i];                                   
68         cur_max_minelem[cur_maxlen] = sticks[i].weight;                         
69       } else if (cur_max_minelem[cur_maxlen_include_i[i]] < sticks[i].weight) { 
70         cur_max_minelem[cur_maxlen_include_i[i]] = sticks[i].weight;            
71       }                                                                         
72     }                                                                           
73     printf("%d\n", cur_maxlen);                                                 
74   }                                                                             
75   return 0;                                                                     
76 }

二分加速提交后運(yùn)行時(shí)間反而為264ms,運(yùn)行時(shí)間慢了,說(shuō)明題目的測(cè)試數(shù)據(jù)可能并不十分均勻。
posted on 2012-09-18 16:47 myjfm 閱讀(540) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 算法基礎(chǔ)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            激情综合在线| 一本久道久久综合狠狠爱| 欧美午夜激情视频| 欧美日韩在线影院| 国产精品人人爽人人做我的可爱| 国产精品户外野外| 亚洲国产成人av| 一区二区免费在线观看| 亚洲国产精品久久精品怡红院 | 一本色道久久99精品综合 | 欧美激情二区三区| 欧美国产日本在线| 日韩一级精品| 久久久亚洲影院你懂的| 欧美黑人在线播放| 国产精品福利在线| 亚洲精品三级| 久久久久久夜| 亚洲视频一二三| 久热精品视频在线| 国产麻豆精品视频| 在线一区亚洲| 亚洲黄色一区| 99精品欧美一区| 久久久www| 国产主播一区二区三区| 在线精品观看| 久久精品99国产精品酒店日本| 欧美高清视频在线播放| 国产日韩欧美在线播放不卡| 性欧美xxxx视频在线观看| 日韩亚洲视频| 国产精品久久久久久模特| 99亚洲一区二区| 一本色道综合亚洲| 国产精品国产三级欧美二区| 99re6这里只有精品| 91久久精品一区二区别| 欧美—级在线免费片| 亚洲裸体俱乐部裸体舞表演av| 免费久久99精品国产| 久久久亚洲人| 亚洲欧美日韩高清| 激情欧美丁香| 亚洲精选在线观看| 国产日韩欧美电影在线观看| 久久另类ts人妖一区二区| 久久综合狠狠| 久久高清免费观看| 另类酷文…触手系列精品集v1小说| 在线成人激情黄色| 女人天堂亚洲aⅴ在线观看| 亚洲激情小视频| 亚洲一区黄色| 一本色道久久综合狠狠躁篇的优点| 日韩写真在线| 亚洲成色精品| 欧美在线视频二区| 亚洲一区二区精品在线| 久久视频在线看| 欧美在线播放一区| 国产精品免费一区二区三区在线观看 | 欧美一区二区视频在线| 免费在线观看日韩欧美| 久久精品国产免费看久久精品| 美女精品在线观看| 久久久久久久成人| 国产视频一区在线| 99视频有精品| 一区二区三区免费看| 欧美大片在线看| 欧美国产一区二区| 亚洲人成网站777色婷婷| 久久久精品一区二区三区| 免费久久久一本精品久久区| 久久久久久久久综合| 国产一区二区三区最好精华液| 亚洲精品在线观看免费| 中文在线资源观看网站视频免费不卡 | 久久精品亚洲一区| 久久网站热最新地址| 在线成人av| 欧美精品在线视频观看| 99www免费人成精品| 欧美人成在线| 一区二区冒白浆视频| 欧美中文在线免费| 亚洲电影激情视频网站| 欧美波霸影院| 亚洲在线视频观看| 欧美激情精品久久久| 亚洲午夜精品一区二区三区他趣| 国产精品毛片va一区二区三区| 欧美一区二区三区在线看| 欧美 日韩 国产在线| 亚洲淫性视频| 最新日韩在线视频| 国产亚洲欧美激情| 欧美激情综合在线| 免费成人av在线| 久久全球大尺度高清视频| 亚洲网在线观看| 中文亚洲欧美| 99国产精品久久久久久久久久| 久久乐国产精品| 性欧美8khd高清极品| 亚洲欧美福利一区二区| 亚洲人体影院| 校园春色综合网| 亚洲网站啪啪| 国产精品mm| 国产精品一区二区久久久| 欧美日韩国产精品一区二区亚洲| 久久xxxx精品视频| 午夜一区二区三区在线观看| 这里只有精品丝袜| 国产专区欧美精品| 亚洲大片av| 99国产精品国产精品久久| 国产一区二区三区日韩| 激情欧美一区二区| 亚洲黄色av一区| aaa亚洲精品一二三区| 99国产一区| 久久不见久久见免费视频1| 久久aⅴ国产欧美74aaa| 麻豆av一区二区三区久久| 亚洲伦理在线免费看| 亚洲天堂av图片| 免费不卡在线观看av| 国产乱码精品一区二区三区不卡| 国产日韩欧美一区二区| 亚洲巨乳在线| 欧美h视频在线| 欧美在线播放高清精品| 国产精品久久久亚洲一区| 亚洲激情一区| 蜜臀av一级做a爰片久久| 在线一区二区三区四区五区| 免费永久网站黄欧美| 国产综合香蕉五月婷在线| 亚洲视频日本| 亚洲高清视频的网址| 久久久精品国产免费观看同学| 欧美日韩亚洲三区| 亚洲乱码精品一二三四区日韩在线| 欧美一区二区啪啪| 亚洲一区视频在线| 国产婷婷一区二区| 亚洲午夜一区二区三区| 亚洲美女免费视频| 亚洲第一福利在线观看| 久久成人资源| 性高湖久久久久久久久| 国产精品综合色区在线观看| 亚洲午夜在线视频| 中日韩视频在线观看| 国产精品欧美风情| 久久久久久久高潮| 久久夜色撩人精品| 日韩一级黄色片| 亚洲黄网站黄| 国产精品乱码妇女bbbb| 久久久综合香蕉尹人综合网| 蜜桃久久av一区| 亚洲影院污污.| 久久免费国产| 欧美一区1区三区3区公司| 另类av一区二区| 香蕉国产精品偷在线观看不卡| 午夜精品视频| 一区二区三区视频在线| 久久裸体视频| 欧美在线免费观看| 国产精品都在这里| 亚洲激精日韩激精欧美精品| 国产偷国产偷精品高清尤物| 欧美成人一区二区| 国产欧美日韩在线视频| 亚洲欧洲视频| 亚洲日本中文字幕区| 欧美一区二区三区免费视| 亚洲一区二区在线看| 欧美顶级艳妇交换群宴| 久久久噜噜噜久噜久久| 国产麻豆日韩| 午夜精品久久久| 欧美在线免费视屏| 国产一区二区三区在线免费观看| 一本到12不卡视频在线dvd| 夜夜爽www精品| 欧美国产日韩一区二区三区| 麻豆久久婷婷| 在线日韩av片| 欧美激情成人在线| 亚洲精选一区二区| 欧美一区久久| 久久久久久久久蜜桃| 久久免费视频一区| 亚洲黄色成人久久久|