Advertisement
bartekltg

KON PA 2013

May 27th, 2013
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include "iostream"
  2. #include "vector"
  3. #include "algorithm"
  4. #include "utility"
  5. #include "cstdio"
  6. #include "functional"
  7. #include "set"
  8. #include "algorithm"
  9. #include <cassert>
  10. #include <ctime>
  11.  
  12. using namespace std;
  13.  
  14. vector<int> konduktorzy;
  15.  
  16.  
  17. typedef long long int lli;
  18.  
  19. lli sprawdzono_przedzialow (long long int t)
  20. {//ile przedzialow sprawdzono lub zaczęto sprawdzać w chwili t
  21.  
  22.     if (t<0) return 0;
  23.     lli licznik=0;
  24.  
  25.     for (vector<int>::iterator konduktor =konduktorzy.begin();konduktor!=konduktorzy.end();++konduktor )
  26.     {
  27.         licznik += (t+(*konduktor))/(*konduktor); //
  28.     }
  29.     return licznik;
  30.  
  31. };
  32.  
  33.  
  34. lli przybliz_czas_double(lli przedzialow, int sup)
  35. {
  36.     double predkosc=0;
  37.     przedzialow-=konduktorzy.size()*(1-sup);//
  38.     for (vector<int>::iterator konduktor = konduktorzy.begin(); konduktor != konduktorzy.end(); ++konduktor )
  39.     {
  40.         predkosc+=1.0/(*konduktor);
  41.     }
  42.     return (lli)((przedzialow)/predkosc)-1+sup;
  43. }
  44.  
  45.  
  46. lli binarne(lli przedzialow)
  47. {
  48.    
  49.     //lli bb= przybliz_czas(przedzialow,1);
  50.     //lli aa= przybliz_czas(przedzialow,0);
  51.  
  52.     lli b= przybliz_czas_double(przedzialow,1);
  53.     lli a= przybliz_czas_double(przedzialow,0);
  54.    
  55.     while (sprawdzono_przedzialow(b) < przedzialow )
  56.     {
  57.             b=b+(b-a);
  58.             a=b-1;
  59.             //printf("a jednak!");
  60.  
  61.     }
  62.     while ( sprawdzono_przedzialow(a) >= przedzialow )
  63.     {
  64.             a=a-(b-a);
  65.             if (a<0)a=-1;
  66.  
  67.             //printf("koniec swiata!");
  68.     }
  69.    
  70.     while (a<b-1)
  71.     {// F(a)<przedzialow<=F(b)
  72.         lli c=(a+b+1)/2;
  73.         lli dzial = sprawdzono_przedzialow(c);
  74.         if (dzial<przedzialow) a=c; else    b=c;
  75.     }
  76.     return b;
  77.  
  78. }
  79.  
  80. int main()
  81. {
  82.     lli przedzialow;
  83.     int k;
  84.        
  85.     scanf("%lld %d",&przedzialow,&k);
  86.     konduktorzy.resize(k);  //czasy konduktorow
  87.  
  88.     for (int i=0;i<k;i++)
  89.         scanf("%d",&konduktorzy[i]);
  90.  
  91.    
  92.     lli t_koniec = binarne(przedzialow);
  93.    
  94.     lli sprawdzono = sprawdzono_przedzialow(t_koniec);
  95.  
  96.     int zakres_czasu = (*max_element(konduktorzy.begin(),konduktorzy.end()))+1;
  97.    
  98.     vector <pair<int,int> > sprawdzenia; //sprawdzenie w czasie t konduktora k.
  99.     sprawdzenia.reserve(k);
  100.  
  101.     for (int kon=0;kon<k;kon++)
  102.     {
  103.         //n log n dzieki magii liczb harmonicznych;)
  104.         for (int hopek= (int)(konduktorzy[kon]*((t_koniec)/konduktorzy[kon]) -t_koniec ); hopek >= -zakres_czasu; hopek-= konduktorzy[kon])
  105.         {
  106.             sprawdzenia.push_back(make_pair(hopek,kon) );
  107.         }
  108.     }
  109.  
  110.  
  111.     sort(sprawdzenia.begin(),sprawdzenia.end(),greater<pair<int,int> >());
  112.  
  113.  
  114.     vector<lli> wyniki(k,-1);
  115.  
  116.     int ind=0;
  117.     while (sprawdzono>przedzialow )
  118.     {
  119.         sprawdzono--;
  120.         ind++;
  121.     }
  122.     for(;ind<sprawdzenia.size();ind++)
  123.     {
  124.         int kond=sprawdzenia[ind].second;
  125.         if (wyniki[kond]<0) wyniki[kond]=sprawdzono;
  126.         sprawdzono--;
  127.     }
  128.  
  129.     for(int i=0;i<k;i++)
  130.     {
  131.         printf("%lld ", wyniki[i]);
  132.     }
  133.  
  134.    
  135.     return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement