yagyagyag @ 2020-04-04 19:39:15
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,a[N];
int find(int x)
{
int l=1,r=n,mid,ans;
while (l<=r){
mid=l+r>>1;
if (a[mid]<=x){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
return ans;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++) scanf("%d",a+i);
sort(a+1,a+n+1);
int ans=0;
for (int i=1;i<=m;i++){
int x;
scanf("%d",&x);
int pos=find(x),minn=2e9;
for (int j=max(1,pos-2);j<=min(n,pos+2);j++)
minn=min(minn,abs(a[j]-x));
ans+=minn;
}
cout<<ans<<endl;
return 0;
}
by metaphysis @ 2020-04-04 20:13:41
@yagyagyag
一个小错误。提示:二分搜索,值未初始化。
by yagyagyag @ 2020-04-04 20:30:52
@metaphysis 那个值?ans吗?请大佬指点
by yagyagyag @ 2020-04-04 20:31:05
ans不用赋值的呀
by 蒟___ @ 2020-04-04 22:11:59
我拿你的代码试测了一下,可能是特判没有写。应该特判一下分数是否大于数组最大值或小于最小值。因此要把a[0]和a[n+1]赋值为inf...大概就是这样??(挠头)
这是我刚刚写的代码,如果以上不能解决就看我代码吧。不知道能不能帮到你。
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef unsigned long long ll;
#define MAXN 100050
ll n, m, g[MAXN] = {}, ans, cmp;
ll def(ll x) {
ll L = 0, R = m + 1;
while (L < R - 1) {
ll mid = (L + R) >> 1;
if (x > g[mid]) {
L = mid ;
}
else if (x < g[mid]) {
R = mid;
}
else if (x == g[mid]) return 0;
//if ((R - mid) <= 1 || (mid - L <= 1)) break;
}
ll xx = (g[R] - x);
ll yy = (x - g[L]);
return xx > yy ? yy : xx;
}
int main() {
ios::sync_with_stdio(false);
cin >> m >> n;
g[0] = g[m + 1] = MAXN*101;
for (ll i = 1; i <= m; i++) {
cin >> g[i];
}
sort(g + 1, g + 1 + m);
while(n--){
ll x;
cin >> x;
ans += def(x);
}
cout << ans;
return 0;
}
加油少年!!!(●'◡'●)
by metaphysis @ 2020-04-04 22:20:46
@yagyagyag
相信我,您赋值为0就可以Accepted了。
by metaphysis @ 2020-04-04 22:21:37
它是一个函数内部的变量,不是全局变量,不会自动赋予初值。
by metaphysis @ 2020-04-04 22:36:33
@yagyagyag
我的意思是二分搜索里的 ans。您不赋值的话,它的初始值就是随机的,如果
int find(int x)
{
int l=1,r=n,mid, 【ans = 0】;
while (l<=r){
mid=l+r>>1;
if (a[mid]<=x){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
return ans;
}
另外,建议将语句:
mid=l+r>>1;
加上括号,变成:
mid = (l + r) >> 1;
这样会直观一些。尽管不加的话也不会错,因为加法的优先级比右移操作要高,但是良好的编程习惯是要靠平时养成的。
by yagyagyag @ 2020-04-05 07:19:23
@metaphysis 已过,感谢
by yagyagyag @ 2020-04-05 07:19:59
@metaphysis 以前写二分都不赋值,所以这里也没写[捂脸]
by metaphysis @ 2020-04-05 08:46:06
@yagyagyag
有空请您访问我的 CSDN博客,里面有我写的一本书,内有编程竞赛相关内容的介绍,并附有对应的练习题目(题目源自UVa OJ),可免费下载此书的PDF版本:《C++,挑战编程——程序设计竞赛进阶训练指南》。 可以的话,还烦您向周围对编程竞赛感兴趣的朋友推荐一下我的博客和书,感谢!