題目連接ios
參考題解數組
題意:spa
給你 整形數組a 和 整形數組b ,要你c[i] = d * a[i] + b[i], 求 在c[i]=0的時候 相同的d的數量 最多能有幾個。.net
思路:code
1. 首先打開別人的博客。blog
2..........ci
一開始嘗試本身作了作 沒作出來,看了別人博客的分析以後發現本身連 d= -b[i]/a[i]都推錯了。 kx(大佬)告訴我這題用map存。 因而補了以後交一發,WA5,緣由是沒有考慮a[i]和b[i]等於0 的時候(這裏注意若是a[i]和b[i]都等於0,那麼不管d爲何數,均可以) 。 把這部分搞了一下以後再交一,WA37,此次的緣由是精度問題 10000000 99999999和 99999999 99999998 的值是同樣的,因而推翻了用double的作法。。 最終的結果是把 a[i]和b[i] 都除以公因數,再用pair 存入map數組。get
#include<iostream> #include<cstdio> #include <cctype> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<cmath> #include<set> #include<vector> #include<stack> #include<queue> #include<map> using namespace std; #define ll long long #define mem(a,x) memset(a,x,sizeof(a)) #define se second #define fi first typedef pair<int,int> pii; const ll mod=998244353; const int INF= 0x3f3f3f3f; const int N=2e5+5; int n; int a[N]; int b[N]; map<pair<int,int> , int> num; priority_queue<int>q; int main() { cin>>n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); int maxn=0; int cnt=0; for(int i=1;i<=n;i++) { if(a[i]==0) { if(b[i]==0) cnt++; } else if(b[i]==0) { num[ pair<int,int>(1,0) ]++; maxn=max(maxn,num[ pair<int,int>(1,0) ] ); } else { // int c= ,由於實在太長了。。 int c= ++num [ pair<int,int>(a[i]/__gcd(a[i],b[i]) , b[i]/__gcd(a[i],b[i]) )]; maxn=max(maxn,c); } } cout<<maxn+cnt<<endl; }