题目描述:给出2D空间中的n只鸟的坐标,射手对其进行射击,要求射击的鸟的坐标越来越大,即对于第i和第i+1只鸟,要求满足:xi<=xi+1 && yi <= yi+1。求最多能射击多少只鸟。
思路:将所有点按照x坐标排序,x坐标相同则按照y坐标排序。则x方向上可以满足限制,对y方向上求最长不下降子序列即可。由于数据量较大,需要采取nlogn的优化算法。
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 100000; 7 int s[N]; 8 int top; 9 10 struct Node 11 { 12 int x, y; 13 } node[N]; 14 15 bool cmp( Node a, Node b ) 16 { 17 if ( a.x != b.x ) return a.x < b.x; 18 return a.y < b.y; 19 } 20 21 int main () 22 { 23 int t; 24 scanf("%d", &t); 25 while ( t-- ) 26 { 27 int n; 28 scanf("%d", &n); 29 for ( int i = 0; i < n; i++ ) 30 { 31 scanf("%d%d", &node[i].x, &node[i].y); 32 } 33 sort( node, node + n, cmp ); 34 top = 0; 35 s[top++] = node[0].y; 36 for ( int i = 1; i < n; i++ ) 37 { 38 if ( node[i].y >= s[top - 1] ) 39 { 40 s[top++] = node[i].y; 41 } 42 else 43 { 44 int tmp = upper_bound( s, s + top, node[i].y ) - s; 45 s[tmp] = node[i].y; 46 } 47 } 48 printf("%d\n", top); 49 } 50 return 0; 51 }
有关nlogn的LIS算法不太理解的可以参考我博客上另一篇文章。
时间: 2024-11-07 05:25:27