(这一题的难度在于读题)题目大意:有一堆引脚(signals),左边一排,右边一排,左边从上到下,对应着连接右边的引脚(所有的引脚都被接上),现在引脚之间的连线有交叉,我们要桥接这些交叉,而桥接是费事的,现在要你求不交叉引脚的最大数目
明白题在说什么以后,是不是感觉豁然开朗?
没错,这一题我们只用把左边的引脚从上到下排列(事实上已经排了),然后看右边对应的引脚的上升序最长有多少就可以了
昨天我弄了一个Wooden Sticks,这一题也要用到LIS,而且还是直接用LIS,更简单
1 #include <iostream> 2 #include <functional> 3 #include <algorithm> 4 5 using namespace std; 6 typedef int Position; 7 8 static int ports[40000]; 9 static int stacks[40000]; 10 11 void Search(const int); 12 Position Binary_Search(const int,const int); 13 14 int main(void) 15 { 16 int case_sum, ports_sum; 17 while (~scanf("%d", &case_sum)) 18 { 19 for (int j = 0; j < case_sum; j++) 20 { 21 scanf("%d", &ports_sum); 22 for (int i = 0; i < ports_sum; i++) 23 scanf("%d", &ports[i]);//左边的每一个点对应右边的拿一个点 24 Search(ports_sum); 25 } 26 } 27 return 0; 28 } 29 30 Position Binary_Search(const int len,const int item) 31 { 32 int left = 0, right = len, mid; 33 34 while (left <= right && left != len) 35 { 36 mid = (left + right) / 2; 37 if (item < stacks[mid]) 38 right = mid - 1; 39 else 40 left = mid + 1; 41 } 42 return left; 43 } 44 45 void Search(const int ports_sum) 46 { 47 int pos; 48 int length = 1; stacks[0] = ports[0]; 49 50 for (int i = 1; i < ports_sum; i++) 51 { 52 pos = Binary_Search(length,ports[i]); 53 54 stacks[pos] = ports[i]; 55 if (pos == length) 56 length++; 57 } 58 printf("%d ", length); 59 }