一、题目描述:小猫吃鱼问题
样例输入:
5
6 3
7 1
3 2
8 3
9 5
样例输出:
29
二、解题思路:
当up主第一眼看到题目描述的时候,完全不知所云 ,后面结合样例慢慢就能理解题目,读完题目之后,我们需要明确题目的几个要点:
- 有n个站点,每一个站点猫都需要吃一条鱼
- 第一个站点猫要吃的鱼只能在第一个站点买,其它站点猫要吃的鱼既可以在本站点买,也可以是前面几站买来的
- 如果本站的鱼是前面的站点买来的,那么本站鱼的总费用就是前面某个站点买鱼的价格,加上鱼运到当前这个站点所需要的保存鱼的总费用
- 什么情况下需要买前面站点的鱼呢?,比如有两个站点分别是a:6 1(6代表鱼的价格,1代表保存鱼到下一站需要的价格)和b:9 3,那咱们怎么选择呢?,第一站吃的鱼只能在第一站买,因此首先花6块钱买第一个站点的鱼,到了第二个站点之后发现鱼的价格是9元,再想一想如果我在上一个站点买鱼到这个站点来吃,那么鱼+运费的价格也才7元,小于9元,因此第二站的鱼应该在第一个站点买,因此总共的最小费用是:6+7=13元。
思路:
将当前站点的鱼的价格与(上一个站点需要的费用+上一个站点保存鱼的价格)进行比较,如果前者较小,那么在当前站点买鱼,如果后者较小,那么买前面站点的鱼
样例分析:
三、代码实现:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int fish_price[105]; //用来存储每一站鱼的价格
int fish_save[105]; //用来存储每一站鱼保存到下一站的费用
int n; //n个站点
int min_sum=0; //用来存储一路花费的最少费用
int min=INT_MAX;
cin>>n;
for(int i=0;i<n;i++)
cin>>fish_price[i]>>fish_save[i];
//核心逻辑代码
for(int i=0;i<n;i++)
{
if(fish_price[i]<min)
min=fish_price[i]; //此时的min代表本站的最小花费
min_sum+=min;
min=min+fish_save[i]; //此时的min代表本站的最小费用+本站的保存费用
}
cout<<min_sum;
return 0;
}
四、总结:
还是要多做题,当学习完一个解题方法之后,一定要去找同类型的题目去做,不断去刷题,这样才能把这个方法真正掌握好,而不是学习完方法就做一题就完了,这样还是不能够完全掌握这种方法(ps:如果你天赋异禀当然除外啦!😊)。