排序子序列(模拟)
#include <iostream>
using namespace std;
const int N = 1e5 + 1;
int n, arr[N], res;
int main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
int i = 0;
while (i < n)
{
if (i == n - 1)
{
res++;
break;
}
if (arr[i] > arr[i + 1])
{
while (i + 1 < n && arr[i] >= arr[i + 1]) i++;
res++;
}
else if (arr[i] < arr[i + 1])
{
while (i + 1 < n && arr[i] <= arr[i + 1]) i++;
res++;
}
else
{
while (i + 1 < n && arr[i] == arr[i + 1]) i++;
}
i++;
}
cout << res << endl;
return 0;
}
#include <iostream>
using namespace std;
int t, h;
int main()
{
cin >> t;
while (t--)
{
int h = 0, cnt = 0, a = 1;
cin >> h;
while (h)
{
cnt++;
h -= a;
if (h % (2 * a) == 0) a *= 2;
}
cout << cnt << endl;
}
return 0;
}
本题有两种常规做法:动态规划和贪心。dp的时间复杂度是N^2,本题的数据范围会超时,贪心的时间复杂度是N*logN,因此本题只能用贪心。
class Solution {
public:
int LIS(vector<int>& a) {
if (a.empty()) return 0;
vector<int> v;
v.push_back(a[0]);
for (int i = 1; i < a.size(); i++)
{
if (a[i] > v.back()) v.push_back(a[i]);
else
{
int l = 0, r = v.size() - 1;
while (l < r)
{
int mid = l + (r - l) / 2;
if (a[i] > v[mid]) l = mid + 1;
else r = mid;
}
v[r] = a[i];
}
}
return v.size();
}
};
本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有