蓝桥杯.直线(数学)

Question:

Result: 40257 

Solve:

这个题还真不太好想,我也看了好多人的题解~

这么一整理之后,就是说只要x2-x1, y2-y1, x2y1-x1y2这三个系数出现不同的状态,就是一条新的直线,那我先把所有的点读入,枚举出所有能构造出的系数,其个数就是答案。

但是还有两个问题

你直接求出的一组系数很可能并不是最简的,需要约去最大公约数,比如2,4,8,你存的时候肯定是以1,2,4去存,要不然后续比对是没办法进行的。

每次构造是以两个点为基础进行的,这两个点构造出的这个系数,别的点可能也能构造出来,所以就需要用到STL的set去重。

至于代码实验:gcd函数不加inline过不去;最后存系数,如果用结构体,得bool判断大小,用ist或者vector更好。

Code:

#include<bits/stdc++.h>
using namespace std;
//最大公约数 
inline int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}
//点结构 
struct Node{
	int x;
	int y;
}node[450];
//set
set<list<int> >s; 
int main(void)
{
	int cnt = 0;
	//读入点 
	for(int i = 0; i < 20; i++)
	for(int j = 0; j < 21; j++)
	{
		node[++cnt].x = i;
		node[cnt].y = j;
	}
	//遍历点 
	for(int i = 0; i <= cnt; i++)
    //第二个点没必要从0开始了
	for(int j = i + 1; j <= cnt; j++)
	{
		int x1 = node[i].x, x2 = node[j].x;
		int y1 = node[i].y, y2 = node[j].y;
		//去掉相同点 
		if(x1 == x2 && y1 == y2) continue;
		//系数计算 
		int a = y2 - y1;
		int b = x1 - x2;
		int c = x2 * y1 - x1 * y2;
		int gcdn = gcd(a,gcd(b, c));
		list<int>l;
		l.push_back(a/gcdn);
		l.push_back(b/gcdn);
		l.push_back(c/gcdn);
		s.insert(l);
	}
	cout <<s.size();
	return 0;
}

  • 30
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UmVfX1BvaW50

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值