CF2085D Serval and Kaitenzushi Buffet
CF2085D Serval and Kaitenzushi Buffet
赛后 10 分钟做完??
第一眼考虑 \(dp\),但简单读题后以及数据范围告诉我并不能在正确的复杂度内设计状态和转移。
于是考虑贪心,在这个过程中我们需要分配时间,但没有特别确切的策略能让我在时间合法的情况下把最优的答案取到,我们可能需要撤销操作,考虑反悔贪心。
我们每次在能拿寿司的时候就拿,在没时间吃并且有更优策略的时候撤销,这时发现由于后续操作是不确定的,我们无法确切地统计这些时间中哪些在吃寿司,哪些是被浪费掉的,考虑倒着做贪心。
这时候我们能取得寿司时一定是剩余的时间可以吃掉的情况,再往前考虑时,若有更优的策略,我们就撤销掉贡献最小的寿司,并返还时间,因为是倒着做的,所以这些时间都可以作用给前面的决策,相当于吃寿司的时间。
对每盘寿司的贡献维护小根堆即可。
const int N=2e5+5;
int T;
int n,k,d[N];
priority_queue<int,vector<int>,greater<int>> q;
void xpigeon(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>d[i];
}
int tim=0;
int ans=0;
for(int i=n;i>=1;i--){
if(tim>=k){
ans+=d[i];
q.push(d[i]);
tim=tim-k;
}else{
if(!q.empty() && q.top()<d[i]){
ans-=q.top();
q.pop();
ans+=d[i];
q.push(d[i]);
tim++;
}else{
tim++;
}
}
}
cout<<ans<<'\n';
while(!q.empty()) q.pop();
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>T;
while(T--) xpigeon();
return 0;
}

浙公网安备 33010602011771号