botgob

brevoptimering

Apr 7th, 2019
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <queue>
  5. #include <map>
  6.  
  7. using namespace std;
  8.  
  9. void insertion_sort(vector<int>& arr, int length) {
  10.     int j, temp;
  11.     for (int i = 0; i < length; i++) {
  12.         j = i;
  13.  
  14.         while (j > 0 && arr[j] < arr[j - 1]) {
  15.             temp = arr[j];
  16.             arr[j] = arr[j - 1];
  17.             arr[j - 1] = temp;
  18.             j--;
  19.         }
  20.     }
  21. }
  22.  
  23. class Person {
  24. public:
  25.     vector<double> ip;
  26.     bool done;
  27.     int nmr;
  28.     int ant;
  29.     int m;
  30. private:
  31.  
  32. };
  33.  
  34. int main() {
  35.     int pers;
  36.     vector<int> aPers;
  37.     vector<vector<int>> prc;
  38.     vector<vector<int>> to;
  39.     vector<Person> inf;
  40.     queue<int> q;
  41.     cin >> pers;
  42.     prc.resize(pers);
  43.     to.resize(pers);
  44.     for (int i = 0; i < pers; i++) {
  45.         Person p;
  46.         inf.push_back(p);
  47.         int tmp = 0;
  48.         cin >> tmp;
  49.         aPers.push_back(tmp);
  50.         tmp = 0;
  51.         cin >> tmp;
  52.         int lp = tmp;
  53.         if (tmp == 0) {
  54.  
  55.         } else {
  56.             for (int j = 0; j < lp; j++) {
  57.                 tmp = 0;
  58.                 cin >> tmp;
  59.                 to[i].push_back(tmp);
  60.                 tmp = 0;
  61.                 cin >> tmp;
  62.                 prc[i].push_back(tmp);
  63.             }
  64.         }
  65.  
  66.     }
  67.     for (int i = 0; i < pers; i++) {
  68.         inf[i].m = aPers[i];
  69.         inf[i].nmr = i;
  70.         inf[i].done = false;
  71.         for (int j = 0; j < to[i].size(); j++) {
  72.             inf[to[i][j] - 1].ant++;
  73.         }
  74.     }
  75.     for (int i = 0; i < inf.size(); i++) {
  76.         if (inf[i].ant == 0) {
  77.             q.push(i);
  78.         }
  79.     }
  80.     int antal = 0;
  81.     vector<int> op;
  82.     while (!q.empty()) {
  83.         int p = q.front();
  84.         q.pop();
  85.         if (inf[p].ant == 0 && inf[p].done == false) {
  86.             if (inf[p].ip.size() == 0) {
  87.                 for (int j = 0; j < to[p].size(); j++) {
  88.                     inf[to[p][j] - 1].ip.push_back(inf[p].m * prc[p][j] * 0.01);
  89.                     inf[to[p][j] - 1].ant--;
  90.                     if (inf[to[p][j] - 1].ant == 0) {
  91.                         q.push(to[p][j] - 1);
  92.                     }
  93.                 }
  94.             } else {
  95.                 double realM = 0;
  96.                 for (int i = 0; i < inf[p].ip.size(); i++) {
  97.                     realM += inf[p].ip[i];
  98.                 }
  99.                 if (realM > inf[p].m) {
  100.                     for (int j = 0; j < to[p].size(); j++) {
  101.                         inf[to[p][j] - 1].ip.push_back(inf[p].m * prc[p][j] * 0.01);
  102.                         inf[to[p][j] - 1].ant--;
  103.                         if (inf[to[p][j] - 1].ant == 0) {
  104.                             q.push(to[p][j] - 1);
  105.                         }
  106.                     }
  107.                 } else {
  108.                     for (int j = 0; j < to[p].size(); j++) {
  109.                         inf[to[p][j] - 1].ip.push_back(realM *prc[p][j] * 0.01);
  110.                         inf[to[p][j] - 1].ant--;
  111.                         if (inf[to[p][j] - 1].ant == 0) {
  112.                             q.push(to[p][j] - 1);
  113.                         }
  114.                     }
  115.                 }
  116.             }
  117.  
  118.         }
  119.         if (inf[p].ant == 0) {
  120.             inf[p].done = true;
  121.             if (inf[p].ip.size() == 0) {
  122.                 op.push_back(p + 1);
  123.             } else {
  124.                 double tmp = 0;
  125.                 for (int j = 0; j < inf[p].ip.size(); j++) {
  126.                     tmp += inf[p].ip[j];
  127.                 }
  128.                 if (inf[p].m <= tmp) {
  129.                     op.push_back(p + 1);
  130.                 }
  131.             }
  132.  
  133.         }
  134.         antal++;
  135.     }
  136.     insertion_sort(op, op.size());
  137.     for (int i = 0; i < op.size(); i++) {
  138.         cout << op[i] << " ";
  139.     }
  140.  
  141. #ifdef _DEBUG
  142.     system("pause");
  143. #endif // _DEBUG
  144.  
  145. }
Advertisement
Add Comment
Please, Sign In to add comment