任务调度
每个任务要单位时间执行,相同任务间要n单位冷却时间。有一些字母表示的任务ABC...,最少需要多少时间。
数量最多的任务t1先排,放1个空n个地排,t1间的(maxCnt-1)个空隔定出框架frame=(maxCnt - 1) * (1 + n)。最后一个t1超出框架1;次多的t2紧靠t1右侧放置,若cnt(t2)==maxCnt则最后一个t2也超出框架1,t3以此类推,共超出框架tasksWithMaxCnt,总共需要frame+tasksWithMaxCnt。其他任务用来填框架,填不满时需要如上时间,填满时需要时间taskCnt。
总时间 max{ (maxCnt - 1) * (1 + n) + tasksWithMaxCnt, tackCnt }
ACCCBBEEE 2
放C: CXXCXXC // CXXCXX算frame,frame=(3-1)*(1+2)=6
放E:CEXCEXCE // 加上最后的CE后frame+tasksWithMaxCnt=8
放A: CEACEXCE
放B: CEACEBCE
CEABCEBCE // 总时间=max{frame+tasksWithMaxCnt,taskCnt}=max(8,9)=9
int leastInterval(vector<char>& tasks, int n) {
vector<int> count(26, 0);
for (char t : tasks) count[t - 'A']++;
int maxCnt = INT_MIN;
int tasksWithMaxCnt = 0;
for (int cnt : count) {
if (cnt > maxCnt) {
maxCnt = cnt;
tasksWithMaxCnt = 1;
} else if (cnt == maxCnt) {
tasksWithMaxCnt++;
}
}
return max((maxCnt - 1) * (1 + n) + tasksWithMaxCnt, (int)tasks.size());
}