搬运我的洛谷题解,原文创作时间:2026-05-19 19:41。
P16556 [ICPC 2026 LAC] Jaime' s Palace
思路
一道很不错的贪心题。
有 $P$ 个盘子,每天拿 $K_i$ 个盘子,用完可以按照任何顺序放回去,要想个办法求出最大的盘子使用次数。
可以用栈模拟,因为题目里一摞碟子就很像栈结构。
从栈(题目中的一摞盘子)取出使用的盘子,把每天使用过的盘子按当前已经使用过的次数从小到大排序,然后放回栈顶。这样就可以让使用次数较少的盘子靠近栈顶,从而在接下来的天数更容易选中,可平衡盘子的使用次数。
模拟完之后,所有盘子的使用次数的最大值就是答案,直接输出即可。
代码
直接献上我的代码好吧。
#include<bits/stdc++.h>
using namespace std;
int main(){
int P,D;
cin>>P>>D;
vector<int>k(D);
for(int i=0;i<D;i++)cin>>k[i];
vector<int>cnt(P,0);//记录每个使用次数
vector<int>st(P);//栈,但是数组模拟,因为这样就可以随机访问!
iota(st.begin(),st.end(),0);
//贪心
for(int it:k){
vector<int>ls(st.begin(),st.begin()+it);//取出前k个盘子
for(int it2:ls)cnt[it2]++;//次数++
sort(ls.begin(),ls.end(),[&](int a,int b){return cnt[a]<cnt[b];});//贪心的必要排序
for(int i=0;i<it;i++) st[i]=ls[i];
}
int mx=*max_element(cnt.begin(),cnt.end());//stl太厉害了,可以直接用内置函数求出最大值(快学学!)
cout<<mx;
return 0;
//完结撒花!
}完结撒花!