题目大意:蛋糕上有 N 个草莓,切一刀使两块蛋糕上的草莓一样多。Ax+By=0 代表切下去的这一刀,输出一组符合的 A 和 B(-500 <= A,B <= 500)。就是求一条过原点的线,使得这条线平分坐标系上的点。
解题思路:高中常做的几何题,若点(x0,y0)在线 Ax+By=0 上,那么带入点的坐标会使得 Ax0+By0=0,在上方 Ax0+By0>0,同理下方 <0。知道这个就简单了,AB 范围不大,暴力枚举。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct point {
int x, y;
};
point p[110];
int main() {
int N, A, B, i;
while (scanf("%d", &N) != EOF && N) {
for (i = 0; i < 2*N; i++)
scanf("%d%d", &p[i].x, &p[i].y);
int t1, t2;
for (A = -500; A <= 500; A++) {
for (B = -500; B <= 500; B++) {
t1 = t2 = 0;
for (i = 0; i < 2*N; i++) {
if (A * p[i].x + B * p[i].y == 0) break;
else if (A * p[i].x + B * p[i].y > 0) t1++;
else if (A * p[i].x + B * p[i].y < 0) t2++;
}
if (i == 2*N && t1 == t2) break;
}
if (i == 2*N && t1 == t2) break;
}
printf("%d %d\n", A, B);
}
return 0;
}