Dmaxiya

[蓝桥杯 2026 省 B] 足球训练 参考代码

Apr 14th, 2026
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct Node {
  4.     long long a, b;
  5.     double t;
  6.  
  7.     Node() {}
  8.  
  9.     Node(long long a, long long b, double t) : a(a), b(b), t(t) {}
  10.  
  11.     bool operator<(const Node& other) const { return t < other.t; }
  12. };
  13.  
  14. long long getCnt(long long a, long long b, double t) {
  15.     long long low = (b - a * t) / (t * b) - 1;
  16.     long long high = low + 5;
  17.     long long mid;
  18.     while (high - low > 1) {
  19.         mid = (high + low) >> 1;
  20.         if (b <= (a + mid * b) * t) {
  21.             high = mid;
  22.         } else {
  23.             low = mid;
  24.         }
  25.     }
  26.     return max(high, 0LL);
  27. }
  28.  
  29. bool judge(double mid, int n, int m, vector<long long>& a,
  30.            vector<long long>& b) {
  31.     long long cnt = 0;
  32.     for (int i = 0; i < n; ++i) {
  33.         cnt += getCnt(a[i], b[i], mid);
  34.     }
  35.     return cnt <= m;
  36. }
  37.  
  38. int main() {
  39.     ios::sync_with_stdio(false);
  40.  
  41.     int n, m;
  42.     cin >> n >> m;
  43.     vector<long long> a(n), b(n);
  44.     double high = 0;
  45.     for (int i = 0; i < n; ++i) {
  46.         cin >> a[i] >> b[i];
  47.         high = max(high, (double)b[i] / a[i]);
  48.     }
  49.     double low = 0;
  50.     double mid;
  51.     while (high - low > 1e-10) {
  52.         mid = (high + low) / 2;
  53.         if (judge(mid, n, m, a, b)) {
  54.             high = mid;
  55.         } else {
  56.             low = mid;
  57.         }
  58.     }
  59.     for (int i = 0; i < n; ++i) {
  60.         long long cnt = getCnt(a[i], b[i], high);
  61.         a[i] += cnt * b[i];
  62.         m -= cnt;
  63.     }
  64.     priority_queue<Node> que;
  65.     for (int i = 0; i < n; ++i) {
  66.         que.push(Node(a[i], b[i], (double)b[i] / a[i]));
  67.     }
  68.     while (m != 0) {
  69.         --m;
  70.         Node tmp = que.top();
  71.         que.pop();
  72.         tmp.a += tmp.b;
  73.         tmp.t = (double)tmp.b / tmp.a;
  74.         que.push(tmp);
  75.     }
  76.     const long long MOD = 998244353;
  77.     long long ans = 1;
  78.     while (!que.empty()) {
  79.         Node tmp = que.top();
  80.         que.pop();
  81.         ans = ans * tmp.a % MOD;
  82.     }
  83.     cout << ans << '\n';
  84.  
  85.     return 0;
  86. }
  87.  
Advertisement
Add Comment
Please, Sign In to add comment