任务调度

每个任务要单位时间执行,相同任务间要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());
}