历年CSP-J初赛真题解析 | 2021年CSP-J初赛完善程序(39-43)

学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。

附上汇总贴:历年CSP-J初赛真题解析 | 汇总_csp历年真题_热爱编程的通信人的博客-CSDN博客


#include <iostream>

using namespace std;

struct point {
    int x, y, id;
};

bool equals(point a, point b) {
    return a.x == b.x && a.y == b.y;
}

bool cmp(point a, point b) {  //相当于a<b
    return ①;
}

void sort(point A[], int n) {  //将关键点的集合按照从小到大方式排序
    for ( int i=0; i<n; i++)
        for (int j=1; j<n; j++)
            if (cmp(A[j], A[j=1])) {
                point t = A[j];
                A[j] = A[j-1];
                A[j-1] = t;
            }
}

int unique(point A[], int n) {  //unique为去重
    int t = 0;
    for (int i=0; i<n; i++)
        if (②)
            A[t++] = A[i];
    return t;
}

bool binary_search(point A[], int n, int x, int y) {  //二分搜索,判断p是否在A[0]-A[n-1]中
    point p;
    p.x = x;
    p.y = y;
    p.id = n;
    int a = 0, b = n - 1;
    while (a<b) {
        int mid = ③;
        if (④)  
            a = mid + 1;
        else
            b = mid;
    }
    return equals(A[a], p);
}

const int MAXN = 1000;
point A[MAXN];

int main() {
    int n;
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> A[i].x >> A[i].y;
        A[i].id = i;
    }
    sort(A, n);
    n = unique(A,n);
    int ans = 0;
    for (int i=0; i<n; i++)
        for (int j=0; i<n; j++)
            if (⑤ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n, A[j].x, A[i].y)) {
                ans ++;
            }
    cout << ans << endl;
    return 0;
}

39、①处应填( )

A.a.x != b.x ? a.x < b.x : a.id < b.id

B.a.x != b.x ? a.x < b.x : a.y < b.y

C.equals(a, b) ? a.id < b.id : a.x < b.x

D.equals(a, b) ? a.id < b.id : (a.x != b.x ? a.x < b.x : a.y < b.y)

【答案】:B

【解析】

因为equals是比坐标,cmp也只能比坐标,所有带id的选项都不能选,所以只能选B。优先级是先比较x再比较y。

40、②处应填( )

A.i == 0 || cmp(A[i], A[i-1])

B.t == 0 || equals(A[i], A[t-1])

C.i == 0 || !cmp(A[i], A[i-1])

D.t == 0 || !equals(A[i], A[t-1])

【答案】:D

【解析】

当A[t-1]不等于A[i],就把A[i]放到A[t]的位置,然后t++。选D

41、③处应填( )

A.b - (b - a) / 2 +1

B.(a + b + 1) >> 1

C.(a + b) >> 1

D.a + (b - a + 1) / 2

【答案】:C

【解析】

二分查找方法有很多种,没有必要背下来,唯一的标准是不能死循环,死循环就是发生在a与b最接近时(a与b的差值为1),即区间为[a, a+1]。此时需要拆为[a]和[a+1]这两个区间,而二分查找拆成的区间就是[a, mid],[mid+1, a+1],那么推断出mid的值要等于a。可以将b=a+1代入,选C。右移一位相当于除2。

42、④处应填( )

A.!cmp(A[mid], p)

B.cmp(A[mid], p)

C.cmp(p, A[mid])

D.!cmp(p, A[mid])

【答案】:B

【解析】

目的是要淘汰不等于p的部分,4个选项,只有B选项成立时,A[0] ... A[mid]不可能等于p,因为此处是A[0] ... A[mid]小于p

43、⑤处应填( )

A.A[i].x == A[j].x

B.A[i].id < A[j].id

C.A[i].x == A[j].x && A[i].id < A[j].id

D.A[i].x < A[j].x && A[i].y < A[j].y

【答案】:D

【解析】

A[i]要在A[j]的左下方,程序的目标就是要在i点和j点之间通过二分查找找到一个点的坐标等于A[i].x和A[j].y

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/132806446