P7375题解

· · 题解

思路解析:

本题其实就是求 a[i] - b[i] 出现的最多次数是几,所以我为大家提供两种思路供大家参考:

1.我们可以用桶解决,具体思路见下面代码中的注释。

2.我们还可以 sort 排序一个数组 c(用来存 a[i] - b[i] 的值),然后遍历数组 c,如果某一项与前一项相同,那么 cnt++ 即可,如果不相同,进行特判,方法见下面代码注释。

下面这一份是用桶做的AC代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int a[1000010],b[1000010],c[50000010];

int main()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i];
    for (int i = 1;i <= n;i++) cin >> b[i];
    for (int i = 1;i <= n;i++)
    {
        c[a[i] - b[i] + 5000000]++;//下标要记得加一个数,避免a[i] - b[i]是负数
    }
    int maxn = -1e9;
    for (int i = 1;i <= 50000000;i++)
    {
        if (c[i] >= maxn) maxn = c[i];
    }
    cout << maxn;
    return 0;
}

下面展示第2种方法,也就是用 for 循环做的:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int a[1000010],b[1000010],c[1000010];

int main()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i];
    for (int i = 1;i <= n;i++) cin >> b[i];
    for (int i = 1;i <= n;i++) c[i] = b[i] - a[i];
    sort(c + 1,c + n + 1);
    int Maxcnt = 0,cnt = 1;//这里初始值也要设成1
    for (int i = 2;i <= n;i++)//从2到n讨论
    {
        if (c[i] == c[i - 1])
        {
            cnt++;
        }
        else
        {
            if (Maxcnt < cnt) Maxcnt = cnt;
            cnt = 1;//这里要注意初始值是1
        }
    }
    if (Maxcnt < cnt) Maxcnt = cnt;//最后还要判断一下
    cout << Maxcnt;
    return 0;
}

谢谢大家的观看~