本来在看《最小割模型在信息学竞赛中的应用》
中间蹦出了“分数规划”四个字。突然想起来,校赛被这道题搞过(当时因为数据水白嫖了一发
现在来学习一下。
分数规划是不符合贪心的!
比如一组数据
cost 12 4 15
value 15 5 25
第一个和第二个的比值是一样的 但是他们分别和第三个一起取的时候的出来的答案是不一样的
入门题。
二分版本
#include <cstdio> #include <cstring> #include <algorithm> #include <functional> #define ll long long using namespace std; const double EPS = 1e-5; const int N = 1010; double a[N], b[N]; double rate[N]; int main() { int n, m; while (~scanf("%d%d", &n, &m) && (n + m)) { m = n - m; for (int i = 1; i <= n; i++) scanf("%lf", &a[i]); for (int i = 1; i <= n; i++) scanf("%lf", &b[i]); double l = 0, r = 100; while (r - l > EPS) { double mid = (l + r) / 2.0; for (int i = 1; i <= n; i++) rate[i] = 100 * a[i] - mid * b[i]; sort(rate + 1, rate + 1 + n, greater<double>()); double check = 0; for (int i = 1; i <= m; i++) check += rate[i]; if (check > EPS) l = mid; else r = mid; } printf("%.0f\n", r); } return 0; }