天天看点

【cf 1133D】注意一下小的细节

1.​​题目链接​​。题目大意:给定两个数组,a,b.用a,b构造c。其中c[i]=a[i]*d+b[i],d是任意的。现在让你来选择合适的d,然后使得c中0尽可能的多。求出这个最多的0.

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
#define ll  long long
ll gcd(ll a, ll b)
{
  return b == 0 ? a : gcd(b, a%b);
}
ll a[N];
ll b[N];
#pragma warning(disable:4996)
typedef pair<ll, ll>pll;
map<pll, int>mp;
int main()
{
  int n;
  while (cin >> n)
  {
    mp.clear();
    for (int i = 0; i < n; i++)
    {
      cin >> a[i];
    }
    for (int i = 0; i < n; i++)
    {
      cin >> b[i];
      //scanf("%lld", &b[i]);
    }
    int  ans = 0;
    int zero = 0;
    for (int i = 0; i < n; i++)
    {
      if (a[i] != 0)
      {
        //cout << (-b[i]/a[i]) << " " << endl;
        int tem = gcd(a[i], b[i]);
        pll a1 = make_pair(-1 * b[i]/tem, a[i]/tem);
        mp[a1]++;
      }
      else
        if (b[i] == 0)
        {
          zero++;
        }
        else
        {
          continue;
        }
    }
    auto iter = mp.begin();
    for (iter = mp.begin(); iter != mp.end(); iter++)
    {
      ans = max(ans, iter->second);
    }
    if (zero)ans += zero;
    cout << ans << endl;
  }
}
/*
2
999999999 1000000000
999999998 999999999
*/      

继续阅读