蓝桥杯--历届真题 直线【第十二届】【省赛】【B组】

是结果填空题,思路是用两个数学公式1.  (y1-y2)=k*(x1-x2);   2. y=k*x+b  来计算出所有的k和b放入到结构体里,写个重载排个序(注意我们k的特殊情况为0,有20条直线即x=0,x=1,x=2,x=3......,这个我们先不将其放入结构体里,再最后计算的时候加上就可以了)。for循环看有多少不同的k,b即可。

注意double的精度问题,这里我们认定当  两个double数的差>1e-8  时二者为不同数,<=1e-8时,二者为相同的数。🌴

答案:40257

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
struct node{
	double k,b;
	bool operator<(const node&t){
		if(k!=t.k)return k<t.k;
		else return b<t.b;
	}
}l[1000010];

int main()
{
	for(int x1=0;x1<20;x1++)
	{
		for(int y1=0;y1<21;y1++)
		{
			for(int x2=0;x2<20;x2++)
			{
				for(int y2=0;y2<21;y2++)
				{
					if(x1!=x2)
					{
						double k=(double)(y1-y2)/(x1-x2);
				      	double b=y1-k*x1;
				    	l[n++]={k,b};
					}
				
				}
			}
		 } 
	}
	sort(l,l+n);
	int ans=1;
	for(int i=1;i<n;i++)
	{
		if(fabs(l[i].b-l[i-1].b>1e-8)||fabs(l[i].k-l[i-1].k)>1e-8)
		ans++;
	}
	cout<<ans+20;
	return 0;
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值