知识点:LIS
思路:思路:res记录目前拥有炮弹系统的高度,len2为res数组长度也为系统数量,res[1]=第一个高度,遍历2~N的高度,找到比输入num大的最小数(用二分的函数),并将其替换成num,若该最小数不存在就将num存入res尾部,len2++。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int res[maxn];
int main()
{
int N, num, len2;
while (~scanf("%d", &N))
{
len2 = 0;
memset(res, 0, sizeof(res));
cin >> num;
res[1] = num, len2++;
for (int i = 2; i <= N; i++)
{
cin >> num;
int idx2 = lower_bound(res + 1, res + len2 + 1, num) - res;
if (idx2 == len2 + 1)
len2++, res[len2] = num;
else
res[idx2] = num;
}
cout << len2 << endl;
}
return 0;
}
本文介绍了一种使用最长递增子序列(LIS)算法解决炮弹系统高度问题的方法。通过遍历高度并利用二分查找更新已有的系统高度,有效地计算出炮弹系统的最大数量。
589

被折叠的 条评论
为什么被折叠?



