题意:
第一行给一个n(<=10^5)
第二行n个数,代表a数组(-10^9<=ai<=10^9)
第二行n个数,代表b数组(-10^9<=bi<=10^9)
请你找一个最佳的d(可以是一个小数)使得ci = d*ai+bi,ci数组中0的个数尽可能多
题解:变形之后d=b[i]/a[i],于是我们只要利用map离散化统计出最多的d就行,但是这题卡精度,所以要用pair存最简的分子分母,然后再用map存每一个pair就行了。
记录一个求gcd得函数—gcd()(注意是两个下划线),__gcd(int x,int y)函数是内置于algorithm头文件中的函数,主要是用于求两个数的最大公约数。
下面是大佬的代码(膜):
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 2e5+5;
map<pii,int> mp;
int a[maxn],b[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
int ans=0;
int tmp=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0&&b[i]==0)
{
tmp++;
continue;
}
else if(a[i]==0) continue;
if(b[i]==0)
{
mp[pii(0,1)]++;
ans=max(ans,mp[pii(0,1)]);
continue;
}
int up=-b[i]/__gcd(a[i],b[i]);
int down=a[i]/__gcd(a[i],b[i]);
if(up<0)
{
up=up*-1;
down=down*-1;
}
mp[pii(up,down)]++;
ans=max(ans,mp[pii(up,down)]);
}
printf("%d\n",ans+tmp);
return 0;
}