第十二届蓝桥杯省赛——直线(模拟)

解法:

        平面直角坐标系上的两个点可以确定一条直线,进而根据坐标可以确定直线方程y=kx+b

统计不同直线的数量即不同{k,b}数据对的数量

答案是:40257

#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main()
{
	set<pair<double,double>> hash;
	//求出关于直线的数据对{k,b}; 
	//求出y=kx+b
	for(int x1=0;x1<20;x1++)
	{
		for(int y1=0;y1<21;y1++)
		{
			for(int x2=x1+1;x2<20;x2++)//注意考虑x2=x1+1,保证效率存在的时候统计直线
			{
				for(int y2=0;y2<21;y2++)
				{
					//求k 和 b
					//k=(y2-y1)/(x2-x1)
					double k=(double)(y2-y1)/(x2-x1);
					//求b就要注意精度问题
					//b=y-kx=y2-(y2-y1)/(x2-x1)*x2 这样先除后乘,让精度损失范围扩大
					//化简成一个除法 b=(y1*x2-y2*x1)/(x2-x1)
					double b=(double)(y1*x2-y2*x1)/(x2-x1);
					hash.insert({k,b}); 
				}
			}
		 } 
	 } 
	 
     //最后一定要加上斜率不存在的时候横坐标就是列的个数一共有20列
	 cout<<hash.size()+20;//40257
	return 0;
 } 

注意考虑x2=x1+1,保证效率存在的时候统计直线

最后一定要加上斜率不存在的时候横坐标就是列的个数一共有20列

其实不难,但是我第一次写的时候还是没能写出来

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值