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;
}
}

浙公网安备 33010602011771号