题解 P3434 【[POI2006]KRA-The Disks】
无论一个管子的半径多长,只要它上面有比它半径小的管子,它的长就毫无意义。 即一个管子真正有效的半径长度是它之上所有半径长中的最小值
然后按管子从下到上,盘子从前到后的顺序,类似乎归并排序的实现
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int S=300030;
ll r[S]; ll k[S];
int n,m;
int main()
{
scanf("%d %d",&n,&m);
for(int i=n;i>=1;i--) scanf("%lld",&r[i]);//倒着输入,方便处理
//r数组中从下到上储存“有效”的半径长度,就是毫无阻碍时能够掉下来
//的最大值
for(int i=1;i<=m;i++) scanf("%lld",&k[i]);//盘子顺序
for(int i=n-1;i>=1;i--)
r[i]=min(r[i],r[i+1]);
int head_1=1; //第head_1个管子
int head_2=1;//第head_2个盘子
while(head_1<=n && head_2<=m)
{
if(r[head_1]>=k[head_2])
{
head_1++; head_2++;
}
else
head_1++;
}
if(head_2<=m)//若盘子未全部放进,则输出0
printf("0\n");
else//可以全部放入,换算出结果
printf("%d\n",n-(head_1-1)+1);
return 0;
}