这是本文档旧的修订版!
这场彻底跪了。
那我贴一贴莫名WA掉的代码们吧。如果读者能找到到底是哪里WA掉了,麻烦您联系我一下。
我觉得从奇顶点开始DFS一定没错。但是评测机不这么认为……
后记:我知道错到哪里了!我一直以为是不重复的覆盖……
其实重复也是可以的,也就是说我硬生生拔高了原题的难度……
唉,怪不得。那么代码就更简单了,low的不谈
上面这个代码是不重复覆盖的优秀代码
储存斜率用了两种做法。开longlong那个TLE掉了,double那个WA了,实在无语……
#include<iostream> #include<vector> #include<map>
using namespace std;
#define x first #define y second
vector<pair<double,double> > points;
int maxPoints() {
int res = 0;
for (int i = 0; i < points.size(); ++i)
{
map<double,int> m;
int duplicate = 1;
for (int j = i + 1; j < points.size(); ++j)
{
if (points[i].x== points[j].x&& points[i].y== points[j].y)
{
++duplicate;
continue;
}
if(points[j].x*points[i].y==points[i].x*points[j].y)
{
continue;
}
double dx = points[j].x- points[i].x;
double dy = points[j].y- points[i].y;
++m[{dx/dy}];
}
res = max(res, duplicate);
map<double,int>::iterator it;
for (it = m.begin(); it != m.end(); ++it)
{
res = max(res, it->second + duplicate);
}
}
return res;
}
int main() {
int n;
scanf("%d",&n);
double x,y;
while(n--)
{
cin >> x >> y;
double temp=x*x+y*y;
points.push_back(make_pair(x/temp,y/temp));
}
cout << maxPoints() << endl;
return 0 ;
}
#include<iostream> #include<vector> #include<map>
using namespace std;
vector<pair<long long,long long> > points;
long long gcd(long long a,long long b) {
return (b == 0) ? a : gcd(b, a % b);
}
int maxPoints() {
int res = 0;
for (int i = 0; i < points.size(); ++i)
{
map<pair<int, int>, int> m;
int duplicate = 1;
for (int j = i + 1; j < points.size(); ++j)
{
if (points[i].first== points[j].first&& points[i].second== points[j].second)
{
++duplicate;
continue;
}
long long x1=points[i].first;
long long x2=points[j].first;
long long y1=points[i].second;
long long y2=points[j].second;
if(x1*y2==y1*x2)
{
continue;
}
long long dx =x2*(x1*x1+y1*y1)-x1*(x2*x2+y2*y2);
long long dy =y2*(x1*x1+y1*y1)-y1*(x2*x2+y2*y2);
long long d = gcd(dx, dy);
++m[{dx / d, dy / d}];
}
res = max(res, duplicate);
map<pair<int,int>,int>::iterator it;
for(it = m.begin(); it != m.end(); ++it)
{
res = max(res, it->second + duplicate);
}
}
return res;
}
int main() {
int n;
scanf("%d",&n);
long long x,y;
while(n--)
{
cin >> x >> y;
points.push_back(make_pair(x,y));
}
cout << maxPoints() << endl;
return 0 ;
}