1 条题解

  • 1
    @ 2024-1-5 16:05:53

    可以求出每个数对应的y-x的值,问题即可转化为要求每组的和都大于等于0。想要组数尽量多,可以让每组都只有两个数(如果有超过两个数,可以只保留其中最大的两个数)。可以把数组排序后,从大到小依次看每一个数,同时用另一个指针p,从小到大遍历(不回头),用来标记和当前枚举的数匹配的数。如果a[i] + a[p] < 0,说明无法匹配,需要让p++。如果能够匹配,则ans++,最终输出ans即可。

    核心代码
    
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> x[i];
    for (int i = 1; i <= n; i++)
        cin >> y[i];
    for (int i = 1; i <= n; i++)
        a[i] = y[i] - x[i];
    sort(a + 1, a + n + 1);
    int p = 1, ans = 0;
    for (int i = n; i > p; i--) {
        while (p < i && a[i] + a[p] < 0)
            p++;
        if (p < i) {
            ans++;
            p++;
        }
    }
    cout << ans << endl;
    
    • 1

    信息

    ID
    630
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    289
    已通过
    59
    上传者