题目描述:
样例:
实现解释:
需要简单分析的贪心题
知识点:
贪心,自定义排序,提前存储
题目分析:
卖鱼,鱼卖出去需要时间,鱼没被卖出去之前需要吃饲料
则有,如果卖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; }
原文地址:https://www.cnblogs.com/doUlikewyx/p/11823863.html
时间: 2024-10-09 18:39:59