注意點:
- 每一個模塊完成後都應進行測試.
- 編程前應當首先自行模擬每個樣例.
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN=2e4,MAXM=1e3;
int restTime[MAXM];//每個水龍頭的剩餘使用時間
int m;//龍頭數量
struct Spigot{
int restTime;
bool operator <(Spigot another)const{
return restTime>another.restTime;
}
};
int remoteTime(){
priority_queue<Spigot> q;
for(int i=1;i<=m;i++){
if(restTime[i])q.push(Spigot{restTime[i]});
}
if(q.empty())return 0;//特殊情況
int remoteVal=q.top().restTime;
for(int i=1;i<=m;i++){
if(restTime[i]){
if(restTime[i]>=remoteVal)restTime[i]-=remoteVal;
else restTime[i]=0;
}
}
return remoteVal;
}
int getEmptyIndex(){//返回空閒位置
for(int i=1;i<=m;i++){
if(!restTime[i])return i;
}
return 0;
}
bool hasPerson(){//是否還有人接水
for(int i=1;i<=m;i++){
if(restTime[i])return 1;
}
return 0;
}
int w[MAXN];//每個人的接水量
int main(){
int n;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=1;i<=m;i++){
restTime[i]=w[i];//第一批人
}
int timeCnt=remoteTime();//先結束掉一個任務
int nowPersonIndex=m+1;//當前隊首的人
while(getEmptyIndex()){
while(getEmptyIndex()&&nowPersonIndex<=n){//如果還有空位置
restTime[getEmptyIndex()]=w[nowPersonIndex];
nowPersonIndex++;
}
timeCnt+=remoteTime();
if(nowPersonIndex>n){
while(hasPerson()){
timeCnt+=remoteTime();
}
break;
}
}
printf("%d\n",timeCnt);
return 0;
}