样例输入
4 5
1 2 3 4
5 5 5 5
样例输出
3
この例では、これら 5 枚の空白のカードのうち、2 枚を取って 1 を書き、1 枚を取って 2 を書きます。このようにして、各カードの番号は 3、3、3、4 になります。A を 2 枚残して 3 セット作ることができます。ブランクカードはシャオミンがセットを作るのに役立ちません。
非常に良いアイデアは、プライオリティ キューを使用して、m を消費するたびにキューの先頭要素を取得し、それをヒープに戻すことです。m が消費されると、キューの先頭にある要素の最初の値が返されます。消去中に Second==0 が発生した場合、これは、書き込みを続ける余地がなくなった場合に中断されることを意味します (これが、O(m+n) の複雑さの下に T がない理由です)。なんてフシギダネだ!
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+7;
typedef long long ll;
int a[N],b[N];
typedef pair<int,int> pr;
int main()
{
// 请在此输入您的代码
priority_queue<pr,vector<pr>,greater<pr> >q;
ll n,m;
cin>>n>>m;
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++) {
q.push({
a[i],b[i]});
}
while(m){
auto it=q.top();q.pop();
int x=it.first,y=it.second;
if(y==0) break;
x++,y--,m--;
q.push({
x,y});
}
cout<<q.top().first;
return 0;
}