Zero Quantity Maximization CodeForces - 1133D(数论,pair记录分子分母防止卡精度,学习一下—gcd()函数的使用)

题意:

第一行给一个n(<=10^5)

第二行n个数,代表a数组(-10^9<=ai<=10^9)

第二行n个数,代表b数组(-10^9<=bi<=10^9)

请你找一个最佳的d(可以是一个小数)使得ci = d*ai+bi,ci数组中0的个数尽可能多

题解:变形之后d=b[i]/a[i],于是我们只要利用map离散化统计出最多的d就行,但是这题卡精度,所以要用pair存最简的分子分母,然后再用map存每一个pair就行了。

记录一个求gcd得函数—gcd()(注意是两个下划线),__gcd(int x,int y)函数是内置于algorithm头文件中的函数,主要是用于求两个数的最大公约数。

下面是大佬的代码(膜):

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 2e5+5;
map<pii,int> mp;
int a[maxn],b[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    int ans=0;
    int tmp=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==0&&b[i]==0)
        {
            tmp++;
            continue;
        }
        else if(a[i]==0) continue;
        if(b[i]==0)
        {
            mp[pii(0,1)]++;
            ans=max(ans,mp[pii(0,1)]);
            continue;
        }
        int up=-b[i]/__gcd(a[i],b[i]);
        int down=a[i]/__gcd(a[i],b[i]);
        if(up<0)
        {
            up=up*-1;
            down=down*-1;
        }
        mp[pii(up,down)]++;
        ans=max(ans,mp[pii(up,down)]);
    }
    printf("%d\n",ans+tmp);
    return 0;
}
原创文章 38 获赞 7 访问量 1726

猜你喜欢

转载自blog.csdn.net/Alanrookie/article/details/106174533
今日推荐