wiki 1156 作业调度方案

来源:互联网 发布:拍淘宝送小礼品 微信 编辑:程序博客网 时间:2024/06/05 02:12

这道题叙述的好啰嗦。。但是耐下心来仔细读一下,其实也是很简单的题。这个题我觉得不太算是动态规划吧。。不知道为什么wiki把此题列为动态规划的分类中。

我的AC代码:

#include <iostream>#include <string.h>#include <vector>using namespace std;#define MAXI 0x07777777struct Node {    int x,y;};vector<Node> robots[25];int m,n;int a[450],robot[25][25],t[25][25],start[25][25],turn[25];void init(){    cin >> m >> n;    memset(start, 0, sizeof(start));    for(int i = 0; i <= 25; i++) turn[i] = 1;    for(int i = 0; i < m*n; i++) cin >> a[i];    for(int i = 1; i <= n; i++){        for(int j = 1; j <= m; j++) cin >> robot[i][j];    }    for(int i = 1; i <= n; i++){        for(int j = 1; j <= m; j++) cin >> t[i][j];    }    for(int i = 1; i <= m; i++) robots[i].push_back(Node{0,MAXI});}int merge (int robotnum, int starttime, int dur){    for(int i = 0; i < robots[robotnum].size(); i++){        Node node = robots[robotnum][i];        if(starttime >= node.x && starttime < node.y){            if(starttime+dur <= node.y){                robots[robotnum].erase(robots[robotnum].begin()+i);                if(starttime+dur < node.y){                    robots[robotnum].insert(robots[robotnum].begin()+i, Node{starttime+dur,node.y});                }                if(starttime > node.x){                    robots[robotnum].insert(robots[robotnum].begin()+i, Node{node.x,starttime});                }                return starttime+dur;            }        }else{            if(starttime < node.x && node.x+dur <= node.y){                robots[robotnum].erase(robots[robotnum].begin()+i);                if(node.x+dur < node.y){                    robots[robotnum].insert(robots[robotnum].begin()+i, Node{node.x+dur,node.y});                }                return node.x+dur;            }        }    }    return -1;}int main(int argc, const char * argv[]){    init();    for(int i = 0; i < n*m; i++){        int gongxu = turn[a[i]];        turn[a[i]]++;        int temprobot = robot[a[i]][gongxu];        int tempt = merge(temprobot,start[a[i]][gongxu],t[a[i]][gongxu]);        start[a[i]][turn[a[i]]] = tempt;    }    int result = 0;    for(int i = 1; i <=m; i++){        result = (result < robots[i][robots[i].size()-1].x ? robots[i][robots[i].size()-1].x : result);    }    cout << result << endl;}


0 0