你这题其实没必要用到priority_queue,因为这道题的灌水的人是按顺序排的,而顺序会影响结果。priority_queue会破坏顺序,导致结果出错。我建议老老实实用模拟的方法去写,哪怕是一滴一滴地去模拟也可以AC。
我的思路是取当前灌水者的最小值和最大值,然后将时间加速(迪亚波罗),给时间增加最小值,然后给灌水的人每个减去最小值。dg是为了防止两个灌水者都是最小值,导致两个人灌好水只走掉一个。具体思路见代码
我的代码贴在这里:
```cpp
#include <iostream>
using namespace std;
int main(){
int n,m; cin >> n >> m;
int *q=new int[n];
for(int i=0;i<n;++i)
cin >> q[i];
int ans=0,mat,mit,dg;
for(int i=m-1;i<n;i+=dg){
int j=0;
dg=0;
mat=0;mit=100;
for(;j<=i;++j){
if(q[j]==0)continue;
mit=min(q[j],mit);
mat=max(q[j],mat);
}
ans+=mit;
for(j=0;j<=i;++j){
if(q[j]==0)continue;
q[j]-=mit;
if(q[j]==0)dg++;
}
}
ans+=mat-mit;
cout << ans;
return 0;
}
```
by gu33gu @ 2023-02-17 16:40:11