题解: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;
}

原文地址:https://www.cnblogs.com/doUlikewyx/p/11823863.html

时间: 2024-10-09 18:39:59

题解:2018级算法第四次上机 C4-商人卖鱼的相关文章

题解:2018级算法第四次上机 C4-最小乘法

题目描述: 样例: 实现解释: 和字符串处理结合的动态规划,个人认为比较难分析出状态转移方程,虽然懂了之后挺好理解的 知识点: 动态规划,字符串转数字 题目分析: 首先按照最基础:依据题意设计原始dp数组,这里根据描可知有三个数需要考虑:数字串开始,数字串结尾和之间插入的乘号数量,因此基础dp[i][j][k],分别为开始,结束脚标和乘号数. 然后推导:考虑到添加乘号,为了使状态转移方程简单,最后固定位置,因此可以考虑每次都在最后插入乘号,插入乘号的位置便可倒序确定.此时数字串的开始位置便可固定

题解:2018级算法第三次上机 C3-Zexal的浩瀚星辰

题目描述: 样例: 实现解释: 一道结合了火箭发射的贪心题目 知识点: 贪心,优先队列 题目分析: 根据题目描述可知,延迟后时间是正常推进的,也就是假设共有n个火箭,推迟k小时.则在到达k+1小时时,每过一个小时只要火箭没发射完都会有k(如果k大于n就是有剩余数量)个火箭会遭受延迟的损失,显然这是必然的(因为到达k小时前的损失都已经确定了,无法改变). 那么依据题意只要使得每次这k个火箭的损失最小即可,而如何最小:让其中单位时间损失最大的火箭发射即可,这样一定比发射其他火箭的损失要小. 于是便可

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

1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升子序列的做法如下: 维护一个数组\(f[]\) ,其中\(f[i]\) 表示当前步骤下长度为i的上升子序列的末尾元素的最小值. 需要注意的是,\(f[i]\) 一定是单调递增的,这个结论十分显然,这里就不做证明了. 使用动态规划思想,对于原序列中的每个元素,都拿去更新一次\(f[]\) .假设当前元

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

Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应该就清楚这是考什么的了. 最长公共子序列:可以不连续.序列长度很大时,暴力方法非常费时,这也是一道比较经典的<算法导论>上的动态规划题. 设序列X=和Y=的一个最长公共子序列Z=,则: 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列: 若xm≠yn且zk≠xm ,则

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

1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限制的时候,\(f[]\) 的更新策略是立即更新.假设间隔为\(T\),现在由于需要考虑间隔,那么在处理第\(i\) 个元素的时候,就需要看到 前\(i -T\) 个元素生成的\(f[]\) ,而不能受到第\(i-T+1\) 到 \(i-1\) 个元素的干扰.因此,考虑如下操作:每次准备更新\(f[]

贪心算法?我全都要!——算法第四章上机实践报告

算法第四章上机实践报告 一.        实践题目 4-1 程序存储问题 (90 分) 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出

题解:2018级算法第二次上机 Zexal的流水线问题

题目描述: 样例: 实现解释: 最基础的流水线调度问题,甚至没有开始和结束的值 知识点:动态规划,流水线调度 实现方法即得出状态转移方程后完善即可,设a[][i]存储着第一二条线上各家的时间花费,t[][i]存储着i处进行线路切换的花费,f[][i]存储着各线在i处的最小花费. 则对每一个f[][i]应有如下的转移方程: f[0][1] = a[0][1]; f[1][1] = a[1][1]; f[0][i] = min(f[0][i-1]+a[0][i],f[1][i-1]+t[1][i-1

题解:2018级算法第二次上机 Zexal的钢管切割

题目描述: 样例: 实现解释: 经典钢管切割问题的变形:最赔钱切割 知识点:动态规划,钢管切割 实现方法即得出状态转移方程后完善为代码即可,先设数组price[i]存储着i长度钢管切割后的最小值,p[i]存储着i长度钢管不切割的值,price数组既是本问题的dp数组. 经过分析可知状态转移方程为: price[0] = 0; price[i] = min(p[1]+price[i-1],p[2]+price[i-2],...p[i-1]+price[1],p[i]); 因为price[i]已经是

题解:2018级算法第二次上机 Zexal的排座位

题目描述: 样例: 实现解释: 一道看似复杂但实际既是斐波那契变形的题目 知识点:递推,斐波那契 通过问题的描述,可以得到以下规律:(除了座位数为一时)男生坐最后时,倒数第二个一定是女生:女生坐最后,倒数第二个均可.转化:i个位置时男生结尾的情况数等于i-1个位置时女生结尾的情况数,i个位置时女生结尾的情况数等于i-1个位置时的总情况数. 于是便可得出两种解决方案:斐波那契变形和直接循环递推 斐波那契变形: i位置男生结尾的情况 = i-1位置女生结尾情况数 = i-2位置总情况数 i位置女生结