大意:判断最多有多少点在同一直线上。
思路:可以通过枚举所有点加判断三点共线去解决,即(y2-x1) /(x2-x1) = (y3-y1)/(x3-x1);
注意输入格式比较特别。
CODE:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
#define MAXN 10001
int x[MAXN], y[MAXN];
int tot;
void init()
{
tot = 0;
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
}
void solve()
{
int Max = 1, kMax;
for(int i = 0; i < tot; i++)
{
for(int j = i+1; j < tot; j++)
{
int k1 = x[j]-x[i], k2 = y[j]-y[i];
kMax = 2;
for(int k = j+1; k < tot; k++)
{
int k3 = x[k]-x[j], k4 = y[k]-y[j];
if(k2*k3 == k1*k4)
{
kMax++;
}
}
Max = max(Max, kMax);
}
}
printf("%d\n", Max);
}
int main()
{
char str[110];
int T;
scanf("%d%*c", &T);
getchar();
while(T--)
{
init();
while(gets(str))
{
if(!str[0] && tot) break;
sscanf(str, "%d%d", &x[tot], &y[tot]);
tot++;
}
solve();
if(T) printf("\n");
}
return 0;
}
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
#define MAXN 10001
int x[MAXN], y[MAXN];
int tot;
void init()
{
tot = 0;
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
}
void solve()
{
int Max = 1, kMax;
for(int i = 0; i < tot; i++)
{
for(int j = i+1; j < tot; j++)
{
int k1 = x[j]-x[i], k2 = y[j]-y[i];
kMax = 2;
for(int k = j+1; k < tot; k++)
{
int k3 = x[k]-x[j], k4 = y[k]-y[j];
if(k2*k3 == k1*k4)
{
kMax++;
}
}
Max = max(Max, kMax);
}
}
printf("%d\n", Max);
}
int main()
{
char str[110];
int T;
scanf("%d%*c", &T);
getchar();
while(T--)
{
init();
while(gets(str))
{
if(!str[0] && tot) break;
sscanf(str, "%d%d", &x[tot], &y[tot]);
tot++;
}
solve();
if(T) printf("\n");
}
return 0;
}