题解: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 <<'\n'; 
        total -= all[i].d;//去除要卖的鱼的花费 
        food += total*all[i].t;//加上卖鱼时需要的总饲料 
    }
    cout << food << '\n';
    return 0;
}
View Code

 

posted @ 2019-11-08 23:27  稼軒  阅读(222)  评论(0编辑  收藏  举报