1 条题解

  • 0
    @ 2025-8-24 22:29:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 王老吉的父亲
    Be kind,for everyone is fighting a hard battle

    搬运于2025-08-24 22:29:16,当前版本为作者最后更新于2021-12-22 23:05:23,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路解析:

    本题其实就是求 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;
    }
    

    谢谢大家的观看~

    • 1

    信息

    ID
    6466
    时间
    1000ms
    内存
    64MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者