省赛在即,只能挑实用的练了,图论交给我的小伙伴了,所以我来搞一搞暴力回溯
这个是暴力入门题,我还WA了。。。
题目给出一个圆,圆内包含很多的点,让你找到一条直线AX+BY=0使得直线两边分布的点个数相同
直接枚举,其实可以加一个gcd(A,B)仅当A,B最大公约数为1时才继续计算
但是看了下数据量,应该不会超时,另外加上了也省不了多少时间
这道题之所以WA就是因为漏掉了A B不能同时为0的情况
代码如下:
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define ll long long
using namespace std;
int x[MAXN];
int y[MAXN];
int main(void) {
int n;
while(scanf("%d", &n), n) {
n *= 2;
for(int i=0; i<n; ++i) {
scanf("%d%d", &x[i], &y[i]);
}
int a, b, t;
int count1 = 0;
int count2 = 0;
int flag = 0;
for(a=-500; a<=500; ++a) {
for(b=-500; b<=500; ++b) {
if(a==0 && b==0)
continue;
count1 = 0;
count2 = 0;
for(int i=0; i<n; ++i) {
t = a*x[i]+b*y[i];
if(t < 0)
count1++;
else if(t > 0)
count2++;
else {
count1 = count2+1;
break;
}
}
if(count1 == count2) {
flag = 1;
break;
}
}
if(flag == 1)
break;
}
printf("%d %d\n", a, b);
}
}