您的位置:首页 > 其它

【51Nod】1279 - 扔盘子(二分)

2017-02-28 16:31 281 查看
题目链接:点击打开题目



题解:记录从最上面到某个位置最窄的宽度,然后对每一个盘子,二分搜索它可以到的最低的地方。

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分