Advertisement
Guest User

Etoile

a guest
Nov 17th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <vector>
  5. using namespace std;
  6. struct Case
  7. {
  8.    int valMax;
  9.    vector<int> rangees;
  10.    vector<int> fixees;
  11.    
  12.    void init(vector<int> a){
  13.       rangees = a;
  14.    }
  15. };
  16. const int nRangees = 12, nCases = 48, nSituations = (1 << 12), OO = nCases * 9 + 1;
  17. vector<Case> cases(nCases);
  18. vector<int> maxRangee(nRangees);
  19. void construit(){
  20.    cases[0].init({4, 11});
  21.    cases[1].init({4, 10});
  22.    cases[2].init({4, 11});
  23.    cases[3].init({5, 11});
  24.    cases[4].init({0, 8});
  25.    cases[5].init({0, 8});
  26.    cases[6].init({0, 9});
  27.    cases[7].init({0, 4, 9});
  28.    cases[8].init({0, 4, 10});
  29.    cases[9].init({0, 5, 10});
  30.    cases[10].init({0, 5, 11});
  31.    cases[11].init({0, 6, 11});
  32.    cases[12].init({0, 6});
  33.    cases[13].init({0, 7});
  34.    cases[14].init({0, 7});
  35.    cases[15].init({1, 8});
  36.    cases[16].init({1, 4, 8});
  37.    cases[17].init({1, 4, 9});
  38.    cases[18].init({1, 5, 9});
  39.    cases[19].init({1, 5, 10});
  40.    cases[20].init({1, 6, 10});
  41.    cases[21].init({1, 6, 11});
  42.    cases[22].init({1, 7, 11});
  43.    cases[23].init({1, 7});
  44.    cases[24].init({2, 4});
  45.    cases[25].init({2, 4, 8});
  46.    cases[26].init({2, 5, 8});
  47.    cases[27].init({2, 5, 9});
  48.    cases[28].init({2, 6, 9});
  49.    cases[29].init({2, 6, 10});
  50.    cases[30].init({2, 7, 10});
  51.    cases[31].init({2, 7, 11});
  52.    cases[32].init({2, 11});
  53.    cases[33].init({3, 4});
  54.    cases[34].init({3, 4});
  55.    cases[35].init({3, 5});
  56.    cases[36].init({3, 5, 8});
  57.    cases[37].init({3, 6, 8});
  58.    cases[38].init({3, 6, 9});
  59.    cases[39].init({3, 7, 9});
  60.    cases[40].init({3, 7, 10});
  61.    cases[41].init({3, 10});
  62.    cases[42].init({3, 11});
  63.    cases[43].init({3, 11});
  64.    cases[44].init({6, 8});
  65.    cases[45].init({7, 8});
  66.    cases[46].init({7, 9});
  67.    cases[47].init({7, 8});
  68. }
  69. int valMin[nSituations];
  70. int main(){
  71.    construit();
  72.    for (int& maxCur : maxRangee)
  73.       cin >> maxCur;
  74.    
  75.    int maxSomme = 0;
  76.    for (Case& caseCur : cases){
  77.       int mini = 9;
  78.       for (int iRangee : caseCur.rangees)
  79.          mini = min(mini, maxRangee[iRangee]);
  80.       caseCur.valMax = mini;
  81.       maxSomme += caseCur.valMax;
  82.      
  83.       for (int iRangee : caseCur.rangees){
  84.          if (maxRangee[iRangee] == mini)
  85.             caseCur.fixees.push_back(iRangee);
  86.       }
  87.    }
  88.    
  89.    for (int& valCur : valMin)
  90.       valCur = OO;
  91.    valMin[0] = 0;
  92.    for (int repBin = 0; repBin < nSituations; ++repBin){
  93.       for (Case casePrise : cases){
  94.          int totCur = valMin[repBin];
  95.          totCur += casePrise.valMax;
  96.          
  97.          int arrivee = repBin;
  98.          for (int fixee : casePrise.fixees)
  99.             arrivee |= (1 << fixee);
  100.          valMin[arrivee] = min(valMin[arrivee], totCur);
  101.       }
  102.    }
  103.    if (valMin[nSituations - 1] != OO)
  104.       cout << valMin[nSituations - 1] << " " << maxSomme << endl;
  105.    else
  106.       cout << "NO SOLUTION\n";
  107.    return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement