题解:CF2170C Quotient and Remainder

· · 题解

转化:

$\therefore x=q_i\times y+r_j ,r_j\in[0,y)$。 由于瓶颈在于 $1\le y<x\le k$。 \ 又考虑取最多,所以 $y=r_j+1$。 ## 做法: 对 $q,r$ 排序,从最大的 $q_i$ 开始搭配最小的 $r_j$,如果无法满足,取下一个 $q_i$ 再试。当 $r_j\ge k$ 或者取空时结束。 复杂度在于排序 $O(n\log n)$。 ## 正确性: 由于 $y$ 固定了从小到大,所以从最大的 $q_i$ 开始贪心可以得到最优解。 ## 代码: ``` int T=read(),n,k,ans; priority_queue<int,vector<int>,less<int>>q1;//q 从大到小 priority_queue<int,vector<int>,greater<int>>q2;//r 从小到大 inline void work(){ n=read();k=read();ans=0;//清空 wl(!q1.empty())q1.pop();wl(!q2.empty())q2.pop(); rep(i,1,n,1) q1.push(read());rep(i,1,n,1) q2.push(read()); wl(!q1.empty()&&!q2.empty()){ //直接得x,y int q=q1.top(),r=q2.top(),y=r+1,x=q*y+r; if(y>k)break;q1.pop(); if(x>k) continue; //合法 q2.pop();ans++; } wr(ans),pr(10); } signed main(){ wl(T--) work(); return 0; } ```