1 条题解

  • 0
    @ 2025-8-24 23:07:34

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar lailai0916
    Student & Developer

    搬运于2025-08-24 23:07:34,当前版本为作者最后更新于2024-12-24 01:39:20,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    原题链接

    解题思路

    $$\begin{aligned} W &= \sum_{i=1}^n(w_i\times c_i) \\ &= \sum_{i=1}^n\left(\min\left(1,\frac{x_i}{k_i}\right)\times 100\times c_i\right) \\ &= 100\sum_{i=1}^n\left(\min(k_i,x_i )\times \frac{c_i}{k_i}\right) \end{aligned} $$

    可以发现,第 ii 门课程每学一天的收益是 ciki\frac{c_i}{k_i},且最多可学 kik_i 天。为了最大化总收益,应优先选择收益较高的课程。

    因此,可以按 ciki\frac{c_i}{k_i} 从大到小排序,然后贪心地选择每门课程最多学习 x=min(ki,m)x = \min(k_i, m) 天,并更新剩余天数 mmxm \gets m - x

    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    
    using ll=long long;
    const int N=1005;
    struct Node
    {
    	int c,k;
    }a[N];
    bool cmp(const Node &u,const Node &v)
    {
    	return u.c*v.k>v.c*u.k;
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr);
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)cin>>a[i].c;
    	for(int i=1;i<=n;i++)cin>>a[i].k;
    	sort(a+1,a+n+1,cmp);
    	double ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		int x=min(m,a[i].k);
    		ans+=x*100.0/a[i].k*a[i].c;
    		m-=x;
    	}
    	cout<<fixed<<setprecision(4)<<ans<<'\n';
    	return 0;
    }
    
    • 1

    信息

    ID
    11047
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者