贪心:循环m次,首先每次取卡片数最少的种类,判断它是否有补充机会,如果没有补充机会,根据短板效应,它的数量就是套牌数,结束。如果可以补充,就将它的数目增加1,m的数量减少1。
知识点:
- 优先队列,小根堆,大根堆
- PII
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pp ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define PII pair<int,int>
const int N = 2e5+10;
int a[N],b[N];
//小根堆
priority_queue<PII,vector<PII>,greater<PII>>p;//大根堆
//priority_queue<PII>p;signed main(){pp;int 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++){p.push({a[i],b[i]});}while(m--){PII t = p.top();p.pop();vector<PII>temp;//如果不进行剪枝优化会超时if(t.second==0){p.push(t);break;}t.second--;t.first++;p.push(t);for(auto it:temp){p.push(it);}}cout<<p.top().first<<endl;return 0;
}