日常水一题,因为n的范围只有200,所以可以暴力枚举两个点,把它们所形成的直线记录下来,去重,直线的条数就是答案。
附上AC代码:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
struct note{
int x,y;
}a[210];
int n,len,ans;
vector <double> c;
int main(void){
scanf("%d",&n);
for (int i=1; i<=n; ++i) scanf("%d%d",&a[i].x,&a[i].y);
for (int i=1; i<=n; ++i)
for (int j=i+1; j<=n; ++j)
if (a[i].x!=a[j].x) c.push_back((a[j].y-a[i].y)*1.0/(a[j].x-a[i].x));
else c.push_back(1e10);
sort(c.begin(),c.end()),ans=c.size();
for (int i=1; i<c.size(); ++i)
if (fabs(c[i]-c[i-1])<1e-10) --ans;
printf("%d",ans);
return 0;
}