fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. ios::sync_with_stdio(false);
  6. cin.tie(nullptr);
  7.  
  8. int N;
  9. long long W;
  10. if (!(cin >> N >> W)) return 0;
  11.  
  12. vector<pair<long long,long long>> a(N); // (w, v)
  13. for (int i = 0; i < N; ++i) {
  14. long long v, w;
  15. cin >> v >> w;
  16. a[i] = {w, v};
  17. }
  18. sort(a.begin(), a.end()); // sort by weight asc
  19.  
  20. // Gom theo trọng lượng
  21. struct Group { long long w; vector<long long> vals; };
  22. vector<Group> g;
  23. for (auto [w, v] : a) {
  24. if (g.empty() || g.back().w != w) g.push_back({w, {}});
  25. g.back().vals.push_back(v);
  26. }
  27.  
  28. priority_queue<long long> pq;
  29. long long ans = 0;
  30. long long usedSlots = 0; // số slot đã dùng theo đơn vị w_{i} của vòng lặp hiện tại
  31.  
  32. for (int i = (int)g.size() - 1; i >= 0; --i) {
  33. // Chuyển đơn vị slot từ w_{i+1} xuống w_i: nhân với r = w_{i+1}/w_i
  34. if (i + 1 < (int)g.size()) {
  35. long long r = g[i + 1].w / g[i].w;
  36. // đảm bảo không vượt quá floor(W / w_i)
  37. long long Ti = W / g[i].w;
  38. __int128 scaled = (__int128)usedSlots * r;
  39. if (scaled > Ti) usedSlots = Ti;
  40. else usedSlots = (long long)scaled;
  41. }
  42.  
  43. // Thêm các món có đúng trọng lượng w_i
  44. for (long long v : g[i].vals) pq.push(v);
  45.  
  46. long long Ti = W / g[i].w; // tối đa slot đơn vị w_i có thể dùng
  47. long long add = Ti - usedSlots; // còn có thể lấp thêm bao nhiêu slot
  48. while (add > 0 && !pq.empty()) {
  49. ans += pq.top(); pq.pop();
  50. ++usedSlots; --add;
  51. }
  52. }
  53.  
  54. cout << ans << '\n';
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0.01s 5288KB
stdin
6 10
1 1
6 2
20 6
8 2
5 2
10 1
stdout
34