D. Zero Quantity Maximization ( Codeforces Round #544 (Div. 3) )
题意:
给你 整形数组a 和 整形数组b ,要你c[i] = d * a[i] + b[i], 求 在c[i]=0的时候 相同的d的数量 最多能有几个。
思路:
1. 首先打开别人的博客。
2..........
一开始尝试自己做了做 没做出来,看了别人博客的分析之后发现自己连 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数组。
#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; }