您的位置:首页 > 其它

数据读取

2016-10-24 19:19 47 查看
#include<cstdio>
#include<iostream>
#define N 100100
#define ll long long
using namespace std;
int n,m;
ll ans;
ll h
,p
;
void erfen(ll l,ll r)
{
if (l>r) return ;
bool ff=0;
ll mid=(l+r)>>1,maxn;
for (int i=1,j=1;i<=n;i++)
{
if (h[i]-p[j]>mid) break;//若此时的磁头与此时需要扫描的位置大于mid,则最大步数应大于mid
if (p[j]<h[i])
{
ll k=mid-(h[i]-p[j]);
maxn=max(p[j]+k,h[i]+(k>>1));//注意">>"的运算级比+还低,要加括号
}
else maxn=h[i]+mid;
while (p[j]<=maxn&&j<=m) j++;
if (j>m)//此时磁头能够扫完所有需要扫描的位置
{
ff=1;
break;
}
}
if (ff) ans=mid,erfen(l,mid-1);
else erfen(mid+1,r);
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) cin>>h[i];//注意在windows系统下,用scanf("%lld")读取相当于读取int类型的数
//由于noip考试是在linx系统下进行,此时用scanf读入无问题
for (int i=1;i<=m;i++) cin>>p[i];
ll rr=2e10;
erfen(0,rr);
cout<<ans<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}


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