Codeforces Div2 2025.11.28

C. Quotient and Remainder

题目大意:
有两个长度为 \(n\) 的数组 \(q\), \(r\), 给定一个 \(k\),选择两个数 \(x,y\) 满足 \(1\leq y\le x\leq k\),其中在 \(q\) 中删除 \(q_i=x/y\),在 \(r\) 中删除 \(r_j=x\%y\),问最多能删除几个数

可以得出这个式子 \(q_j*y+r_i=x\),很显然 \(y> r_i\),而我们要让 \(x\) 尽可能的小,就不妨让 \(y=r_i+1\), 此时 \(q=(x-r)/(r+1)\),并且让 \(x\) 取到 \(k\),同时也让 \(q\) 取到能取到的最大。
如果最大的 \(r\) 能匹配到一个 \(q\),那么说明其余的 \(r\) 也可以用这个 \(q\),所以按照 \(r\) 从大到小排序

这里发现不排序,甚至随机打乱 \(r\) 也能过 🤔

namespace Solution{
    int n, k;
    void Main(){
        cin >> n >> k;
        vector<int> q(n + 1), r(n + 1);
        For (i, 1, n) cin >> q[i];
        For (i, 1, n) cin >> r[i];
        sort(r.begin() + 1, r.end(), greater<int>());
        multiset<int> Q(q.begin() + 1, q.end());
        int ans = 0;
        For (i, 1, n){
            int rr = r[i];
            int yy = (k - rr) / (rr + 1);
            auto it = Q.upper_bound(yy);
            if (it != Q.begin()){
                ans++;
                Q.erase(prev(it));
            }
        }
        cout << ans << endl;
    }
}
  
posted @ 2025-12-01 19:33  xyzEcho  阅读(4)  评论(0)    收藏  举报