1 solutions
-
0
Guest MOD
-
0
最大化最小甜度问题适合用二分法求解。通过二分猜测最小甜度 ,然后验证是否存在至少 种水果的甜度 ,且其中价格最小的 种水果的总价格 。
#include <bits/stdc++.h> using namespace std; #define int long long #define endl '\n' const int N = 1e5 + 10; struct Fruit { int sweetness; int price; } fruits[N]; int n, B, k; bool cmp(Fruit a, Fruit b) { return a.price < b.price; } bool check(int mid) { vector<Fruit> valid; for (int i = 1; i <= n; i++) { if (fruits[i].sweetness >= mid) { valid.push_back(fruits[i]); } } int cnt = valid.size(); if (cnt < k) return false; sort(valid.begin(), valid.end(), cmp); int sum = 0; for (int i = 0; i < k; i++) { sum += valid[i].price; if (sum > B) return false; } return sum <= B; } void solve() { cin >> n >> B >> k; int min_sweet = INT_MAX, max_sweet = 0; for (int i = 1; i <= n; i++) { cin >> fruits[i].sweetness >> fruits[i].price; min_sweet = min(min_sweet, fruits[i].sweetness); max_sweet = max(max_sweet, fruits[i].sweetness); } int left = min_sweet, right = max_sweet; int ans = -1; while (left <= right) { int mid = left + (right - left) / 2; if (check(mid)) { ans = mid; left = mid + 1; } else { right = mid - 1; } } cout << ans << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); solve(); return 0; }
- 1
Information
- ID
- 1476
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- (None)
- # Submissions
- 81
- Accepted
- 15
- Uploaded By