题意:p, q,都是整数.
sigma(Ai * ki)>= p,
sigma(Bi * ki) >= q;
ans = sigma(ki)。输出ans的最小值
约束条件2个,但是变量k有100000个,所以可以利用对偶性转化为求解
ans = p * y1 + q * y2
约束条件为:
Ai * y1 + Bi * y2 <= 1 其中i为0~n-1
也就是n个约束条件。 后面三分搞搞就好了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + ;
double A[maxn], B[maxn], p, q;
int n;
double check(double x){
double y = 1e20;
for (int i = ; i < n; i++){
y = min(y, (-A[i]*x)/B[i]);
}
return p * x + y * q;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while (~scanf("%d%lf%lf", &n, &p, &q)){
for (int i = ; i < n; i++){
scanf("%lf%lf", A+i, B+i);
}
double l = , r = 1.0/(*max_element(A, A+n));
for (int i = ; i < ; i++){
double ml = (l + l + r) / ;
double mr = (r + r + l) / ;
if (check(ml) > check(mr)){
r = mr;
}else{
l = ml;
}
}
printf("%.20f\n", check((l+l)/));
}
return ;
}