题意解读
这道题问的是两个坐标覆盖的的范围(【0,19】【0,20】)内有多少条直线:
我们知道可以通过斜率k和截距w确定一条直线。我们通过对比两条线的斜率和截距是否相同判断是否为不同的线。注意,当直线为90度的时候斜率不存在,但是因为横坐标是0~19,因此可以确定的是竖着的直线有20条,我们最后答案加上20即可。还有,我们不能够直接判断两条线的截距和斜率是否相同,会有误差,应该通过判断其差值是否大于1e-8来判断。
code
#include<bits/stdc++.h>
using namespace std;
const int N=200000; //一共有400个点,400的平方160000,这里开200000够了
int n;
struct Line
{
double k,b;
bool operator<(const Line& t)const
{
if(k!=t.k)return k<t.k;
return b<t.b;
}
}l[N];
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)(y2-y1)/(x2-x1);
double b=y1-k*x1;
l[n++]={k,b};
}
}
}
}
}
sort(l,l+n);
int res=1;
for(int i=1;i<n;i++)
{
if(fabs(l[i].k-l[i-1].k)>1e-8||fabs(l[i].b-l[i-1].b)>1e-8) //不能直接比较两条线斜率和截距是否相同,会有误差
res++;
}
cout<<res+20; //加上那20条垂线
return 0;
}
答案:40257