题意:
起初在二维平面上有n条直线,爱丽丝会选择k条直线,然后鲍勃画一条直线,爱丽丝想让鲍勃画出的直线与她选择的直线交点最多,而鲍勃想让交点最少,问当爱丽丝选择1到n条直线时,鲍勃画出的直线与之最小交点个数是多少。
思路:
对于两条直线来说,不相交则意味着一定平行(重合也算作平行),因此,鲍勃若是想让交点最小,则每次需要找到最多数量的相同斜率的直线,而爱丽丝则需要选择尽可能多的斜率不相等的直线。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
double l[100010];
map<double,int> vis;
int e[100010];
const double pi = acos(-1);
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
int xa,xb,ya,yb;
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
l[i] = xa == xb ? pi : (yb-ya)*1.0/(xb-xa)*1.0;
vis[l[i]]++;
}
int cnt = 0;
for(int i = 1; i <= n; i++)
{
vis[l[i]] > 0 ? e[++cnt] = vis[l[i]],vis[l[i]] = 0 : vis[l[i]] = 0;
}
sort(e+1,e+1+cnt);
int now = 1,k = 1,flag = 1;
for(int i = 1; i <= n; i++)
{
e[now]--;
flag = e[now] == 0 ? now+1: flag;
printf("%d\n",i-k);
now == cnt ? now = flag,k++ : now++;
}
}
}