学习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