1.排序子序列
排序子序列
贪心+模拟
1.1解析
1.2代码
#include <iostream>
using namespace std;
const int N=1e5+10;
int n;
int arr[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>arr[i];
int ret=0,i=0;
while(i<n)
{
if(i==n-1)//不用跟后面的进行比较了
{
ret++;
break;
}
if(arr[i+1]>arr[i])//呈上升趋势
{
while(i+1<n&&arr[i+1]>=arr[i])i++;
ret++;
}
else if(arr[i+1]<arr[i])//呈下降趋势
{
while(i+1<n&&arr[i+1]<=arr[i])i++;
ret++;
}
else//平滑
{
while(i+1<n&&arr[i+1]==arr[i])i++;
}
i++;
}
cout<<ret<<endl;
return 0;
}
2.消减整数
消减整数
贪心
2.1解析
2.2代码
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)//t次输入
{
int x=0;
cin>>x;
int ret=0,a=1;
while(x)
{
x-=a;
if(x%(2*a)==0)a*=2;
ret++;
}
cout<<ret<<endl;
}
return 0;
}
3.NC164 最长上升子序列(二)
NC164 最长上升子序列(二)
动态规划、贪心+二分
3.1解析
3.2代码
class Solution {
int dp[100010]={0};//dp[i]:表示长度为i的末尾是什么
int pos=0;
public:
int LIS(vector<int>& a) {
for(auto& x:a)
{
if(pos==0||x>dp[pos])
dp[++pos]=x;
else
{
//二分查找插入位置
int l=1,r=pos;
while(l<r)
{
int mid=(l+r)/2;
if(dp[mid]>=x)r=mid;
else l=mid+1;
}
dp[l]=x;
}
}
return pos;
}
};