题海拾贝:P1208 [USACO1.3] 混合牛奶 Mixing Milk
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!
我的博客:<但凡.
我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C++修炼之路》
欢迎点赞,关注!
1、题目
2、题解
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5010;
struct node
{int p;int a;
}w[N];
int n,m;
bool cmp(node& x,node& y)
{return x.p<y.p;
}
int main()
{cin>>n>>m;for(int i=1;i<=m;i++){cin>>w[i].p>>w[i].a; }//贪心int ret=0;sort(w+1,w+1+m,cmp);for(int i=1;i<=m&&n;i++){int sum=(n>=w[i].a)?w[i].a:n;ret+=sum*w[i].p;n-=sum;}cout<<ret<<endl;return 0;
}
算法是一系列解决特定问题或完成特定任务的明确指令步骤。简单来说,它是计算机科学中的“食谱”,告诉计算机如何高效、准确地处理数据。算法的核心在于**输入→处理→输出**的逻辑。
算法的关键特性:
1. 有穷性:必须在有限步骤内结束。
2. 确定性:每一步骤的定义必须清晰无歧义。
3. 可行性:能用基本操作实现。
4. 输入/输出:有明确的输入和输出。
---
学习算法的有效方式与建议:
1. 夯实基础
- 数学基础:离散数学、概率论、线性代数(尤其是图论、递归、时间复杂度分析)。
- 编程基础:至少掌握一门语言(如Python、C++或Java),熟悉循环、递归、数据结构(数组、链表、树等)。
2. 系统学习路径
- 经典算法分类学习:
- 排序算法(快速排序、归并排序)
- 搜索算法(DFS、BFS、二分查找)
- 动态规划(背包问题、最长公共子序列)
- 贪心算法(Dijkstra、霍夫曼编码)
- 图算法(拓扑排序、最短路径)
- 推荐资源:
- 书籍:《算法导论》《算法(第4版)》
- 在线课程:Coursera的《Algorithms Specialization》(Stanford)、MIT OpenCourseWare。
3. 刻意练习
- 刷题平台:LeetCode(按难度分类)、Codeforces(竞赛向)、HackerRank(基础巩固)。
- 从简单题开始:先掌握暴力解法,再逐步优化(例如从O(n²)到O(nlogn))。
- 定期复盘:整理错题本,分析时间/空间复杂度。
4. **可视化与类比**
- 用工具观察算法执行过程(如VisuAlgo、Algorithm Visualizer)。
- 将算法与现实类比(例如:快递配送路径≈旅行商问题)。
5. 参与实践
- 参与开源项目(如GitHub上算法相关的库)。
- 尝试用算法解决生活问题(如用动态规划优化个人时间安排)。
6. 避免常见误区
- 不要死记硬背代码,理解思想更重要。
- 不要急于求成,复杂度分析比AC(Accepted)更重要。
---
坚持每天解决1-2道题,3个月后会显著提升。算法的核心是**模式识别+抽象能力**,需要长期积累。