wyh的物品

wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个,问你在所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的k个物品的总价值和总重量的比值)

输入描述:
输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,对于每组测试数据,第一行输入两个数n和k(1<=k<=n<=100000)
接下来有n行,每行两个是a和b,代表这个物品的重量和价值

输出描述:
对于每组测试数据,输出对应答案,结果保留两位小数
示例1
输入
1
3 2
2 2
5 3
2 1
输出
0.75
说明
对于样例来说,我们选择第一个物品和第三个物品,达到最优目的

//238ms
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
const double eps = 1e-6;
struct node
{
    
    
    double w, v, f;
    bool operator < (const node &tmp) const
	{
    
    
        return f < tmp.f;
    }
}use[maxn];
int main()
{
    
    
    int t;
	cin>>t;
    while(t--)
	{
    
    
        int n, k;
		cin >> n >> k;
        for(int i = 0;i < n; ++i) cin >> use[i].w >> use[i].v;
        double res = rand(), res_cal = res + 2;
        while(fabs(res_cal - res) > eps)
		{
    
    
            res = res_cal;
            for(int i = 0; i < n; ++i)
                use[i].f = res * use[i].w - use[i].v;
            sort(use, use + n);
            double w_use = 0, v_use = 0;
            for(int i = 0; i < k; ++i)
                w_use += use[i].w, v_use += use[i].v;
            res_cal = 1.0 * v_use / w_use;
        }
        cout << fixed << setprecision(2) << res << endl;
    }
    return 0;
}
//387ms
#include<bits/stdc++.h>
using namespace std;
int c[100005], v[100005], n, k;
double p[100005];
bool check(double x)
{
    
    
	for(int i = 0; i < n; i++)
		p[i] = v[i] - x * c[i];
	sort(p, p + n);
	double sum = 0;
	for(int i = n - 1; i >= n - k; i--)
		sum += p[i];
	return sum >= -0.00001;
}
int main()
{
    
    
	int T;
	scanf("%d", &T);
	while(T--)
	{
    
    
		scanf("%d%d", &n, &k);
		for(int i = 0; i < n; i++)
			scanf("%d%d", &c[i], &v[i]);
		double l = 0, r = 200, mid;
		while(l <= r)
		{
    
    
			mid = (l + r) / 2;
			if(fabs(r - l) < 0.001) break;
			if(check(mid)) l = mid;
			else r = mid;
		}
		printf("%.2f\n", mid);
	}
	return 0;
}
//173ms
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
const double eps = 1e-6;
struct node
{
    
    
    double w, v, f;
    bool operator < (const node &tmp) const
	{
    
    
        return f < tmp.f;
    }
}use[maxn];
int main()
{
    
    
    int t, n, k;
    scanf("%d", &t);
    while(t--)
	{
    
    
        scanf("%d%d", &n, &k);
        for(int i = 0;i < n; ++i) scanf("%lf%lf", &use[i].w, &use[i].v);
        double res = rand(), res_cal = res + 2;
        while(fabs(res_cal - res) > eps)
		{
    
    
            res = res_cal;
            for(int i = 0; i < n; ++i)
                use[i].f = res * use[i].w - use[i].v;
            sort(use, use + n);
            double w_use = 0, v_use = 0;
            for(int i = 0; i < k; ++i)
                w_use += use[i].w, v_use += use[i].v;
            res_cal = 1.0 * v_use / w_use;
        }
        cout << fixed << setprecision(2) << res << "\n";
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44826711/article/details/114005242
今日推荐