51nod 1279

来源:互联网 发布:手机硬件检测软件 编辑:程序博客网 时间:2024/06/03 18:38

要明确一定盘子是从给定的序列从左到右扔进去的、

这样说吧、盘子能不能扔到一个位置是看盘子能不能从最顶上落到这个位置,换句话说就是这个位置前面有没有长度小于这个盘子长度的值、

那么我们维护一个最小值,minx[i]代表从顶到i这个位置的最小值是多少、

接下来就要从这个井的尾巴开始扫,如果碰到minx[i]>=dish[j]的话说明这个盘子可以落到i这个位置、

为什么从尾巴开始扫呢、  仔细想想、

#include<cmath>#include<cstdio>#include<algorithm>using namespace std;const int qq = 50050;int well[qq],dish[qq];int minx[qq];int main(){int n,m;scanf("%d%d",&n,&m);minx[0] = 1e9+10;for(int i=1; i<=n; ++i){scanf("%d",well+i);minx[i]=min(minx[i-1], well[i]);//printf("%d\n",minx[i]);}for(int i=1; i<=m; ++i)scanf("%d",dish+i);dish[m+1]=0;int len=0;for(int i=n; i>=1; --i)if(dish[len+1]<=minx[i]){len++;//printf("%d %d\n",minx[i], i);}printf("%d\n", len);}


0 0
原创粉丝点击