题解 CF21B 【Intersection】

本题需掌握知识:一次函数相关知识、分支结构

要想考虑全面确实起码绿的难度,再加上 if 不写乱,蓝题也是差不多的罢(个人向)。


考虑各种情况,我们一 一分析:

  1. 有一个式子三个系数都是0:很显然无论 x,y 取何值,0=0 这个恒等式绝对成立,那么这个式子是覆盖整个坐标系的,肯定有无限个点重合,-1石锤。
  2. 有一个式子 a,b 两系数为0,c不为0:很显然这个式子无解,所以绝对没有重合,0石锤。
  3. 在上述均不满足的条件下,有一个式子 b 系数为0:此时该直线平行于 y 轴,另一条直线一定会与它相交。
  4. 在两个式子的 b 均为0的情况下:
    1. 有一个式子 a 为0 但c不为0,同2.所述。
    2. 两个式子 c都为0 或 a都为0 或 a,c 成比例关系,说明两直线重合,输出-1
    3. 剩余情况肯定平行或无解,0石锤。
  5. 在上述均不满足且a,b成比例关系时
    1. 如果 b,c 也成比例关系,说明两直线重合,-1走人。
    2. 肯定平行。
  6. 肯定相交。

心态差点炸了

注意:因为涉及到除法运算,建议使用floatdouble类型存储六个数据。

#include<bits/stdc++.h>
using namespace std;
double a1,b1,c1,a2,b2,c2;
int solve() {
	if(b1||b2) {
		if((!a1&&!b1&&!c1)||(!a2&&!b2&&!c2)) return -1;
		if((!a1&&!b1)||(!a2&&!b2)) return 0;
		if(!b1||!b2) return 1;
	} else {
		if((!a1&&c1)||(!a2&&c2)) return 0;
		if(!(c2||c1)||!(a2||a1)||a1/c1==a2/c2) return -1;
		return 0;
	}
	if(a1/b1==a2/b2) {
		if(c1/b1==c2/b2) return -1;
		return 0;
	}
	return 1;
}
int main() {
	cin>>a1>>b1>>c1>>a2>>b2>>c2;
	cout<<solve();
	return 0;
}

代码还是很短的,但是调好有点难

另:可以使用desmos帮助理解。

posted @ 2020-04-21 21:59  ahawzlc  阅读(117)  评论(0编辑  收藏  举报