Advertisement
bartekltg

Cieplo-zimno

Nov 25th, 2016
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <iostream>
  2. #include "cielib.h"
  3. #include <bitset>
  4. #include <vector>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. vector<int> gorne;
  10. vector<int> dolne;
  11. vector<int> roznice;
  12. int d;
  13. int R;
  14.  
  15. int maxsize(){
  16.     return max_element(begin(roznice),end(roznice)) - begin(roznice);
  17. }
  18.  
  19. int ustaw_punkty(vector<int> &a, vector<int>&b, int dM)
  20. {
  21.     for (int i=0;i<d;i++){//ustaw wszystkie z grubsza w srodku
  22.         a[i]=dolne[i] + (gorne[i]-dolne[i])/2;
  23.         b[i]=dolne[i] + (gorne[i]-dolne[i])/2;
  24.     }
  25.     a[dM] = dolne[dM];//ustaw wlasciwy wymiar na skrajach
  26.     b[dM] = gorne[dM];
  27.     return  b[dM]-a[dM]; //srednica
  28. }
  29.  
  30. int main(int argc, char *argv[])
  31. {
  32.  
  33.     d = podajD();
  34.     R = podajR();
  35.  
  36.     gorne   = vector<int>(d, R);
  37.     dolne   = vector<int>(d, 0);
  38.     roznice = vector<int>(d, R);
  39.  
  40.     int dM = maxsize(); // wymiar, w ktorym srednice chcemy zredukowac
  41.     vector<int> a (d,0);
  42.     vector<int> b (d,0);
  43.  
  44.     while (roznice[dM]>1)
  45.     {
  46.         int srednica = ustaw_punkty(a,b,dM);
  47.         czyCieplo(a.data());
  48.  
  49.         if (czyCieplo(b.data())){
  50.             dolne[dM] += (srednica)/2+1; // d+1 d+1
  51.         }else{
  52.             gorne[dM] -= srednica/2; //- ((srednica%2==1)?1:0);
  53.         }
  54.  
  55.         roznice[dM] = gorne[dM]-dolne[dM];
  56.         dM = maxsize();
  57.     }
  58.  
  59.     while (roznice[dM]>0)
  60.     {
  61.         int ia = dolne[dM];
  62.         int ib = gorne[dM];
  63.  
  64.         ustaw_punkty(a,b,dM);
  65.  
  66.         if (ib==R){ // nie można iść w górę
  67.             swap(a,b);
  68.             swap(ia,ib);
  69.         }
  70.         int kierunek = ib-ia; //normalnie +1
  71.  
  72.         vector<int> c = b;
  73.         c[dM] +=kierunek;
  74.         czyCieplo(c.data());
  75.  
  76.         if      (!czyCieplo(b.data()))
  77.             ia += kierunek;
  78.         else if (czyCieplo(a.data()))
  79.                 ib-= kierunek;
  80.         else if (czyCieplo(b.data()))
  81.             ia += kierunek;
  82.         else
  83.             ib-= kierunek;
  84.  
  85.         dolne[dM]=min(ia,ib);
  86.         gorne[dM]=max(ia,ib);
  87.         roznice[dM] = gorne[dM]-dolne[dM];
  88.         dM = maxsize();
  89.     }
  90.  
  91.     ustaw_punkty(a,b,0);
  92.     znalazlem(a.data());
  93.  
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement