这么写咋错了,我理解错题目了?

P1678 烦恼的高考志愿

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。您不赋值的话,它的初始值就是随机的,如果 x 比数组 a 中的所有原始都要小,则ans的值不确定,因为没有机会执行 ans = mid; 这一句。

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++,挑战编程——程序设计竞赛进阶训练指南》。 可以的话,还烦您向周围对编程竞赛感兴趣的朋友推荐一下我的博客和书,感谢!


| 下一页