一、题目链接
二、题目分析
(一)算法标签
枚举 精度问题
(二)解题思路
三、AC代码
解法一:
#include <iostream>
#include <set>
using namespace std;
const int INF = 1e9;
typedef pair<double, double> PDD;
int main()
{
set<PDD> s;
int n1, n2;
n1 = 20, n2 = 21;
// n1 = 2, n2 = 3;
for (int x1 = 0; x1 < n1; x1 ++ )
for (int y1 = 0; y1 < n2; y1 ++ )
{
for (int x2 = 0; x2 < n1; x2 ++ )
for (int y2 = 0; y2 < n2; y2 ++ )
{
if (x1 == x2) s.insert({INF, x1});
else
{
double k = (double)(y2 - y1) / (x2 - x1);
// double b = y1 - k * x1; 错误!
// double b = y1 - (y2 - y1) * x / (x2 - x1); 错误!
// 错误原因是double精度损失,应避免减法
double b = (double)(y1*(x2-x1) - x1*(y2-y1)) / (x2 - x1);
s.insert({k, b});
}
}
}
cout << s.size();
return 0;
}