开map统计,如果用double会爆精度。。。
细节挺多
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> P; map<P,int> mp; int a[200010]; int b[200010]; 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 cnt0=0; for(int i=1;i<=n;i++) { P pp; if(b[i]==0&&a[i]==0) //注意两个都为0的情况,c取任何数都可以 { cnt0++; continue; } if(a[i]==0) continue; int index=__gcd(abs(a[i]),abs(b[i]));//这里gcd要对正数 int num1=abs(b[i])/index; int num2=abs(a[i])/index; int fu=0; if(b[i]<0) fu++; if(a[i]<0) fu++;//这里要统计有几个负数 if(fu==1) pp=P(-num1,num2);//这里要标准化负号在哪里 else pp=P(num1,num2); if( mp.find(pp)!=mp.end() ) mp[pp]++; else mp[pp]=1; } int ans=0; for(auto it=mp.begin();it!=mp.end();it++) { ans=max(ans,it->second); //printf("%d ",it->second); } //printf(" "); printf("%d ",ans+cnt0); }