题目链接:点击打开题目
题解:记录从最上面到某个位置最窄的宽度,然后对每一个盘子,二分搜索它可以到的最低的地方。
代码如下:
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))
#define PI acos(-1.0)
#define LL long long
int main()
{
int n,m;
int t;
int minn = 1e9 + 7;
scanf ("%d %d",&n,&m);
vector<int> v;
for (int i = 0 ; i < n ;i++)
{
scanf ("%d",&t);
minn = min(minn,t);
v.push_back(minn);
}
int endd = v.size();
int l,r,mid;
int ans = 0;
for (int i = 0 ; i < m ; i++)
{
scanf ("%d",&t);
l = 0;
r = endd;
while (r >= l)
{
mid = (l + r) >> 1;
if (r == l && r == endd)
{
l = endd;
break;
}
if (t <= v[mid])
l = mid + 1;
else
r = mid - 1;
}
endd = l - 1;
if (endd == -1) //判断是否没有位置
continue;
ans++;
}
printf ("%d\n",ans);
return 0;
}