Advertisement
xzhao

jsp.cpp

Oct 16th, 2019
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <sstream>
  6.  
  7. using namespace std;
  8.  
  9. int m, n;
  10. vector<int> seq;
  11. struct Step {
  12. int mid;
  13. int time;
  14. int minstarttime;
  15. };
  16.  
  17. vector<vector<Step> > workout;
  18. struct Span {
  19. int start;
  20. int len;
  21. };
  22.  
  23. int getEarliest(vector<Span> &mspan, int len, int &before, int &after, int minstart) {
  24. if(mspan.size() == 0) {
  25. return minstart; // empty machine
  26. } else {
  27. for(int i = 0; i < mspan.size(); i ++) {
  28. if(i == 0) {
  29. if(mspan[i].start >= len + minstart) { // slot between 0 and mspan[i].start
  30. // get the smallest possible start
  31. after = i;
  32. return minstart; // fill the earliest slot
  33. }
  34. } else {
  35. int prevend = mspan[i-1].start + mspan[i-1].len;
  36. int mlen = mspan[i].start - prevend;
  37. if(mlen >= len && minstart+len <= mspan[i].start) {
  38. before = i-1;
  39. after = i;
  40. return max(minstart, prevend);
  41. }
  42. }
  43. }
  44. // insert at the back
  45. before = mspan.size() - 1;
  46. return max(minstart, mspan.back().start + mspan.back().len);
  47. }
  48. }
  49.  
  50. int main() {
  51. ifstream fin("jsp.in");
  52. // n items, each item m steps
  53. fin >> m >> n;
  54. for(int i = 0; i < m*n; i ++) {
  55. int t;
  56. fin >> t;
  57. seq.push_back(t);
  58. }
  59. workout = vector<vector<Step> >(n+1, vector<Step>(m+1, Step{}));
  60. for(int i = 1; i <= n; i ++) {
  61. for(int j = 1; j <= m; j ++) {
  62. int t;
  63. fin >> t;
  64. workout[i][j].mid = t;
  65. }
  66. }
  67. for(int i = 1; i <= n; i ++) {
  68. for(int j = 1; j <= m; j ++) {
  69. int t;
  70. fin >> t;
  71. workout[i][j].time = t;
  72. }
  73. }
  74.  
  75. int total = 0;
  76. vector<int> currentStep = vector<int>(n+1, 1);
  77. vector<vector<Span> > mspan = vector<vector<Span> >(m+1, vector<Span>());
  78. for(int i = 0; i < m * n; i ++) {
  79. int citem = seq[i];
  80. int cstep = currentStep[citem];
  81. Step s = workout[citem][cstep];
  82. int cmachine = s.mid;
  83. int citemstart = s.minstarttime;
  84. int before = -1, after = -1;
  85. int cstart = getEarliest(mspan[cmachine], s.time, before, after, citemstart);
  86.  
  87. if(after == -1) { // insert at the end
  88. mspan[cmachine].push_back(Span{.start = cstart, .len = s.time});
  89. } else { // insert at position after
  90. vector<Span>::iterator it = mspan[cmachine].begin();
  91. mspan[cmachine].insert(it+after, Span{.start = cstart, .len = s.time});
  92. }
  93. currentStep[citem] ++;
  94. if(currentStep[citem] <= m) {
  95. workout[citem][currentStep[citem]].minstarttime = cstart + s.time;
  96. }
  97. }
  98.  
  99. for(int i = 1; i <= m; i ++) {
  100. if(!mspan[i].size()) {
  101. continue;
  102. }
  103. Span &s = mspan[i].back();
  104. if(total < s.start + s.len) {
  105. total = s.start + s.len;
  106. }
  107. }
  108.  
  109. ofstream fout("jsp.out");
  110. fout << total << endl;
  111.  
  112. return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement