题解:2018级算法第四次上机 C4-商人卖鱼

Posted doulikewyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解:2018级算法第四次上机 C4-商人卖鱼相关的知识,希望对你有一定的参考价值。

题目描述:

 

技术图片

 

 

样例:

 技术图片

 

 

实现解释:

需要简单分析的贪心题

知识点:

贪心,自定义排序,提前存储

 

题目分析:

卖鱼,鱼卖出去需要时间,鱼没被卖出去之前需要吃饲料

则有,如果卖a鱼的话b鱼会吃饲料c份,而卖b鱼a鱼会吃d份,为了消耗更少的饲料,如果c比d小,则应该卖a鱼。而计算上即c = a.t*b.d,d = a.d*b.t。

因此需要做的就是依据上述公式对所有鱼的买卖优先级进行排序(排序的cmp函数实现有进行简单解释),然后按顺序计算需要的饲料数即可。

为了不再遍历计算卖鱼时的花费,这里用total存储当前剩余鱼的吃饲料数。

 

难点:

不算太难,主要既是分析出鱼的优先级,并且合理的排序和提前存储

 

完整代码:

技术图片
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 100010
long long n;
long long total,food;
struct fish
{
    long long t;
    long long d;
}all[MAX];//简单定义一个鱼 
bool cmp(fish a,fish b){
    //比较函数白话解释 
    //第一个参数是自己,第二个是别人
    //如果(比较条件成立)我自己就会比其他人更靠近队列头部
    
    //这里的情况就是如果我的d乘上他人的t大于他人的d乘上自己的t
    //即如果卖我会需要更多的饲料,我就更靠近头部,先卖我 
    return a.d*b.t > a.t*b.d;
}
int main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    total = food = 0;
    //为了避免遍历计算,和浩瀚星辰一样的提前存储花费 
    for(int i = 0;i<n;i++)
    {
        cin >> all[i].t >> all[i].d;
        total += all[i].d;
    }
    sort(all,all+n,cmp);
    //不必优先队列,因为直接全部处理即可,和星辰的区别 
    for(int i = 0;i<n;i++)
    {
//        cout << all[i].t <<‘ ‘<< all[i].d <<‘
‘; 
        total -= all[i].d;//去除要卖的鱼的花费 
        food += total*all[i].t;//加上卖鱼时需要的总饲料 
    }
    cout << food << 
;
    return 0;
}
View Code

 

以上是关于题解:2018级算法第四次上机 C4-商人卖鱼的主要内容,如果未能解决你的问题,请参考以下文章

2016级算法第四次上机-B ModricWang的序列问题

2016级算法第四次上机-D.AlvinZH的1021实验plus

2016级算法第四次上机-G.ModricWang的序列问题 II

2016级算法第四次上机-E.Bamboo and the Ancient Spell

2016级算法第四次上机-A.Bamboo 和人工zz

2016级算法第四次上机-F.AlvinZH的最“长”公共子序列