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;
    
}

 

posted @ 2019-03-09 12:47  木流牛马  阅读(175)  评论(0编辑  收藏  举报