我搞不懂这USACO 2016 Bronze的暴力搜索了,我过了六个点超时4个点,我暴搜的方法有点问题感觉

#include <bits/stdc++.h>
using namespace std;
int N, B, minv = 1000000;
struct aa {
int xp;
int yp;
};
bool cmp (aa x, aa y) { // 排序函数
if (x.xp == y.xp) return y.yp > x.yp;
return x.xp < y.xp;
}
int main () {
freopen("balancing.in", "r", stdin);
freopen("balancing.out", "w", stdout);
cin >> N >> B;
aa coordinate[110];
int minv_y = 1000000, maxv_y = -1; // 找到y轴十字的起始位置和终止位置
for (int i = 1; i <= N; i++) {
cin >> coordinate[i].xp >> coordinate[i].yp;
minv_y = min (minv_y, coordinate[i].yp);
maxv_y = max (maxv_y, coordinate[i].yp);
}
sort (coordinate + 1, coordinate + N + 1, cmp);
for (int i = coordinate[1].xp - 1; i <= coordinate[N].xp + 1; i += 2) { // 竖直渐近线
for (int j = minv_y - 1; j <= maxv_y + 1; j += 2) { // 水平渐近线
int zone1 = 0, zone2 = 0, zone3 = 0, zone4 = 0, maxv = -1;
for (int x = 1; x <= N; x++) {
if (coordinate[x].xp > i && coordinate[x].yp > j) zone1++;
else if (coordinate[x].xp > i && coordinate[x].yp < j) zone4++;
else if (coordinate[x].xp < i && coordinate[x].yp > j) zone2++;
else if (coordinate[x].xp < i && coordinate[x].yp < j) zone3++;
}
maxv = max (maxv, zone1);
maxv = max (maxv, zone2);
maxv = max (maxv, zone3);
maxv = max (maxv, zone4);
minv = min (minv, maxv);
}
}
cout << minv;
fclose (stdin);
fclose (stdout);
return 0;
}
我还没有学二分离散这些高级的东西,从优化暴力搜索的角度怎么解?
能讲的详细点吗,我听懂了成功提交就立马结题