nickel2halide

B.cc

Mar 28th, 2012
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <cassert>
  2.  
  3. #include <iostream>
  4. #include <fstream>
  5. #include <algorithm>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. const int MAXN = 100005, MAXK = 1005;
  11. const int ITER = 100;
  12. int N, K, H;
  13.  
  14. struct Lemming {
  15.   public:
  16.     Lemming() : m(0), v(0), idx(-1), k(m, v) {}
  17.     Lemming(int m, int v, int idx) : m(m), v(v), idx(idx), k(m, v) {}
  18.     bool operator<(Lemming const& o) const {
  19.       return k < o.k;
  20.     }
  21.     int m, v;
  22.     int idx;
  23.   private:
  24.     pair<int, int> k;
  25. };
  26.  
  27. int m[MAXN], v[MAXN];
  28. Lemming lem[MAXN];
  29. int sol[MAXK];
  30.  
  31. bool check(long double t) {
  32.   int i = 0, j = 0, ht = H;
  33.   while (i < N && j < K) {
  34.     if (ht <= t * lem[i].v) {
  35.       ht += H;
  36.       sol[j] = lem[i].idx;
  37.       ++j;
  38.     }
  39.     ++i;
  40.   }
  41.   return j == K;
  42. }
  43.  
  44. int main() {
  45.   ios_base::sync_with_stdio(false);
  46.  
  47.   cin >> N >> K >> H;
  48.  
  49.   int i;
  50.   for (i = 0; i < N; ++i)
  51.     cin >> m[i];
  52.   for (i = 0; i < N; ++i) {
  53.     cin >> v[i];
  54.     lem[i] = Lemming(m[i], v[i], i);
  55.   }
  56.   sort(lem, lem + N);
  57.   vector<int> m1(m, m + N);
  58.  
  59.   long double lo = 0, hi = K * H, mid;
  60.   for (i = 0; i < ITER; ++i) {
  61.     mid = (lo + hi) / 2;
  62.     if (check(mid))
  63.       hi = mid;
  64.     else
  65.       lo = mid;
  66.   }
  67.   check(hi);
  68.  
  69.   vector<int> m2(m, m + N);
  70.   for (i = 0; i < N; ++i)
  71.     if (m1[i] != m2[i])
  72.       cerr << i << ' ' << m1[i] << ' ' << m2[i] << '\n';
  73.   assert(equal(m1.begin(), m1.end(), m2.begin()));
  74.  
  75.   for (i = 0; i < K; ++i) {
  76.     cout << sol[i] + 1;
  77.     if (i == K - 1)
  78.       cout << '\n';
  79.     else
  80.       cout << ' ';
  81.   }
  82.  
  83.   cout << flush;
  84.   return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment