Sensor Optimization Dilemma 2

赛时魔怔了,这没瞪出来!

很容易想到,对着答案二分,检查每个工序的效率大于等于 mid 时所需的最少钱数之和是否小于等于

在决定每条生产线需要哪些机器时,从贪心的角度考虑,应该多选一些性价比更高的机器,性价比低的机器使用量应该较小。感性理解一下,性价比低的机器绝对不会选太多。卡着数据范围选一个比较大的数(我使用了 ),枚举性价比较低的机器使用多少台,最后选择这些可能中较小的作为当前生产线的答案就对了。

其实选择 就足够了,但是我比较懒,不想写证明。

#include <bits/stdc++.h>
using namespace std;
istream& fin = cin;
ostream& fout = cout;
using ui = unsigned int;
using uli = unsigned long long int;
using li = long long int;
int main(void) {
  ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  size_t n;
  uli x;
  fin >> n >> x;
  vector<array<pair<uli, uli>, 2>> a(n);
  for (auto& i : a) {
    fin >> i[0].first >> i[0].second >> i[1].first >> i[1].second;
    if ((float)i[0].first / i[0].second > (float)i[1].first / i[1].second)
      swap(i[0], i[1]);
  }
  uli l = 0, r = 1e9 + 1;
  while (l < r) {
    uli mid = (l + r + 1) / 2;
    uli sum = 0;
    for (auto const& i : a) {
      uli minx = numeric_limits<uli>::max();
      for (ui j = 0; j < 10000; ++j)
        minx = min(minx, i[0].second * j +
                             (i[0].first * j >= mid
                                  ? 0
                                  : (mid - i[0].first * j + i[1].first - 1) /
                                        i[1].first * i[1].second));
      sum += minx;
    }
    sum <= x ? l = mid : r = mid - 1;
  }
  fout << l;
  return 0;
}
posted @ 2024-10-07 18:34  MrPython  阅读(4)  评论(0)    收藏  举报  来源