Acw234.放弃测试
题意:
求从$n$中去掉$k$个$i$,使得$100*\frac{\sum a_i}{\sum b_i}$最大。
思路:
01分数规划。
假设答案为$L$,那么有:
$$
\frac{\sum a_i}{\sum b_i}\geq L
$$
转换一下:
$$
\sum a_i-Lb_i\geq 0
$$
当$L$大的时候,$\sum a_i-Lb_i$会变小,显然具有单调性,可以二分。
所以我们二分$L$,并重新定义一个数列为$a_i-Lb_i$,对其进行排序,之后对第$k+1$到第$n$个数求和,看看其是否大于等于$0$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3+10;
int n, k, a[maxn], b[maxn];
double c[maxn];
bool check(double x)
{
for(int i = 1; i <= n; i++)
c[i] = a[i]-x*b[i];
sort(c+1, c+1+n);
double ans = 0;
for(int i = k+1; i <= n; i++)
ans += c[i];
return ans >= 0;
}
void solve()
{
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
double l = 0, r = 1e9;
while(fabs(r-l) > 1e-6)
{
double mid = (l+r)/2;
if(check(mid)) l = mid;
else r = mid;
}
double ans = (int)(100.0*l+0.5);
cout << ans << endl;
}
int main()
{
while(1)
{
scanf("%d%d", &n, &k);
if(n == 0 && k == 0) break;
solve();
}
return 0;
}
orz