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;
    
}
相關文章
相關標籤/搜索