是结果填空题,思路是用两个数学公式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;
}