现在的位置: 首页 > 综合 > 正文

CodeForces 21B Intersection (简单题)

2018年01月14日 ⁄ 综合 ⁄ 共 1076字 ⁄ 字号 评论关闭

题目类型  数学


题目意思
对于方程 A1*x + B1*y + C1 = 0 和 A2*x + B2*y + C2 = 0 决定的两个点集的交集的元素数量是多少
所有参数均为整数, 取值满足区间 -> [-100,100]

解题方法
方法很多
例如可以先变换下方程 A1x+B1y+C1=0 -> y = -A1/B1 - C1/B1  然后代入方程 A2x+B2y+C2=0 中
则  (A2-A1*B2/B1)x + C2-C1*B2/B1 = 0, 即求这个方程的解有多少个(注意这个方程只有当 B1 != 0 时才有意义)
所以如果 B1 == 0 && B2 == 0时要特判下,见参考代码
参考代码 - 有疑问的地方在下方留言 看到会尽快回复的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int main() {
	int a1, b1, c1, a2, b2, c2;
	while(scanf("%d%d%d", &a1, &b1, &c1) != EOF) {
		scanf("%d%d%d", &a2, &b2, &c2);
		if( (a1 == 0 && b1 == 0 && c1) || (a2 == 0 && b2 == 0 && c2) ) {
			printf("0\n");
			continue;
		}
		if(b1 == 0 && b2 == 0) {
			if(a1 == 0 || a2 == 0) printf("-1\n");
			else {
				double t1 = -c1*1.0/a1;
				double t2 = -c2*1.0/a2;
				if(fabs(t1-t2) <1e-12) printf("-1\n");
				else printf("0\n");
			}
			continue;
		}
		else if(b1) {
			double A = a2 - a1*b2*1.0/b1;
			double B = c2 - c1*b2*1.0/b1;
			//printf("%lf %lf\n", A, C);
			if(fabs(A)<1e-12 && fabs(B)<1e-12) printf("-1\n");
			else {
				if(fabs(A)<1e-12) printf("0\n");
				else printf("1\n");
			}
		}
		else if(b2) {
			double A = a1 - a2*b1*1.0/b2;
			double B = c1 - c2*b1*1.0/b2;
			//printf("%lf %lf\n", A, C);
			if(fabs(A)<1e-12 && fabs(B)<1e-12) printf("-1\n");
			else {
				if(fabs(A)<1e-12) printf("0\n");
				else printf("1\n");
			}
		}
	}
	return 0;
}

抱歉!评论已关闭.