咖啡杯问题:
*第一个数组表示咖啡机冲咖啡的时间 a=[3,2,7]
*第二个参数表示有多少个人去排队喝咖啡 10
*第三个参数洗咖啡杯的时间
*第四个参数不洗也能变干净的时间
*问从人群开始泡咖啡开始,直到最后一个杯子变干净至少需要多少时间
#include<iostream>
#include<vector>
using namespace std;
* 咖啡杯问题:
*第一个数组表示咖啡机冲咖啡的时间 a=[3,2,7]
*第二个参数表示有多少个人去排队喝咖啡 10
*第三个参数洗咖啡杯的时间
*第四个参数不洗也能变干净的时间
*问从人群开始泡咖啡开始,直到最后一个杯子变干净至少需要多少时间
*
int TimeLine=0;
struct Element{
int FinishTime; //结束时间,记录洗完后空闲的时间
int MachineNumber;//机器编号,记录所使用的机器是哪一台
};
vector<Element> SmallRootPile;
void insert(int MachineNumber,vector<int> Timecost){
Element newTime=Element{TimeLine+Timecost[MachineNumber],MachineNumber};
auto i=SmallRootPile.begin();
for(;i!=SmallRootPile.end();i++){
if(i->FinishTime>newTime.FinishTime){
SmallRootPile.insert(i,newTime);
break;
}
}
if(i==SmallRootPile.end()){
SmallRootPile.push_back(newTime);
}
}
int WashTime(vector<int>finishTime,int a,int b,int index,int washLine){
if(index==finishTime.size()-1){
return min(max(finishTime[index],washLine)+a,finishTime[index]+b);
}
int wash=max(washLine,finishTime[index])+a;
int next1=WashTime(finishTime,a,b,index+1,washLine);
int p1=max(wash,next1);
int dry=finishTime[index]+b;
int next2=WashTime(finishTime,a,b,index+1,washLine);
int p2=max(dry,next2);
return max(p1,p2);
}
int lineup(int PersonNum,vector<int>MachineTime,int a,int b){
vector<int> finishTime;
for(int i=0;i<MachineTime.size();i++){
if(PersonNum==0) break;
insert(i,MachineTime);
PersonNum--;
}
while(!SmallRootPile.empty()){
Element tmp=SmallRootPile[0];
SmallRootPile.erase(SmallRootPile.begin());
TimeLine=tmp.FinishTime;
finishTime.push_back(TimeLine);
if(PersonNum>0){
int FreeMachine=tmp.MachineNumber;
insert(FreeMachine,MachineTime);
PersonNum--;
}
}
return WashTime(finishTime,a,b,0,TimeLine);
}
int main(){
vector<int>array;
int n;
cin>>n;
for(int i=0;i<n;i++){
int tmp=0;
cin>>tmp;
array.push_back(tmp);
}
cin>>n;
int a,b;
cin>>a>>b;
cout<<lineup(n,array,a,b)<<endl;;
return 0;
}