D. Zero Quantity Maximization ( Codeforces Round #544 (Div. 3) )

 

题目连接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;
    
}
相关文章
相关标签/搜索