记录13
#include <bits/stdc++.h>
using namespace std;
int main() {
int r,b,c,d,e;
int t,max=-99999;
cin>>r>>b>>c>>d>>e;
for(int i=0;i<=min(r,b);i++){
t=(r-i)*c+(b-i)*d+i*2*e;
if(t>max) max=t;
}
cout<<max;
return 0;
}
突破点
- 如果把一个红色小球放在一个红色盒子里,那么得分是 C。
- 如果把一个蓝色小球放在一个蓝色盒子里,那么得分是 D。
- 如果把一个红色小球放在一个蓝色盒子里,那么得分是 E。
- 如果把一个蓝色小球放在一个红色盒子里,那么得分也是 E。
思路
刚看到题目的时候以为是一个多条件分支判断题,经过分析后,发现就是个数学公式题
- 不同的得分想要最大,不仅仅是单独考虑最大的,要考虑总分数
- 遍历所有得到分数的情况
- 每次遍历都进行一个打擂台来取出最大值
代码简析
int t,max=-99999;
t是暂存值,目的是记录每一次得分的情况
max是得分的最大值,考虑到数据“−1000≤C,D,E≤1000”有负数,所以取一个大点的负数
for(int i=0;i<=min(r,b);i++){
t=(r-i)*c+(b-i)*d+i*2*e;
if(t>max) max=t;
}
i代表的是错位球的情况,一开始的时候从0开始统计,即一开始无错位球
min(r,b)代表错位球的最大数量
例如:
有2个红球放在2个红盒子,3个蓝球放在3个蓝盒子
那么红盒子的2个球就是错位球的最大情况
因为3个蓝球没有3个红盒子摆放(只有2个红盒子)
t=(r-i)*c+(b-i)*d+i*2*e;代表球在不同情况的得分,并存储在t里面,一开始是无错位球情况
i*2*e是因为每当有错位球出现时候的得分情况,都是成双出现的,所以要i*2
例如:
有2个红球放在2个红盒子,3个蓝球放在3个蓝盒子
现在红盒子里面有一个错位球,即2个红盒子👉放1个红球跟1个蓝球,拿出一个红球
3个蓝盒子👉放2个蓝色的球跟一个空缺的蓝盒子
这时候从红盒子里面拿出去的红球就放在了蓝盒子的空缺位置
所以每次有错位球,都是成双出现的
注意:这一题如果要是陷入了分支判断的思考中,就会写非常多的冗长的代码,需要判断不同的分的比较。所以分析题目的时候需要抓住题目的重点突破口,此题通过得分的最大情况来直接进行遍历,找到数学公式后,开始枚举,会让题目迎刃而解。
补充
分析算法题中的数学关系是解决算法问题的关键步骤。通过清晰地识别和理解题目中的数学关系,可以更有效地设计算法。以下是一个清晰的处理方式,帮助你分析算法题中的数学关系:
1. 仔细阅读题目
理解问题:仔细阅读题目描述,确保完全理解问题的要求和限制条件。
标记关键信息:用笔标记或在草稿纸上记录关键信息,如输入格式、输出格式、数据范围等。
2. 提取数学关系
识别变量:确定题目中的变量及其含义。
识别关系:找出变量之间的关系,如等式、不等式、函数关系等。
识别模式:观察数据的规律和模式,如周期性、对称性等。
3. 建立数学模型
定义变量:明确每个变量的定义和范围。
建立方程:根据题目描述,建立数学方程或不等式。
简化模型:如果可能,简化方程或模型,使其更易于处理。
4. 选择算法
分析复杂度:根据数据范围,选择合适的算法。
考虑优化:考虑是否可以使用优化技术,如动态规划、贪心算法等。
5. 实现算法
伪代码:先写出伪代码,确保算法逻辑清晰。
编码:将伪代码转换为实际代码,注意代码的可读性和效率。
6. 测试和验证
边界条件:测试边界条件,确保算法在极端情况下也能正确运行。
多种测试用例:使用多种测试用例验证算法的正确性。
7. 优化和调整
性能优化:根据测试结果,优化算法的性能。
代码优化:优化代码的可读性和效率。
示例分析
假设题目要求计算一个数的各位数字之和。
题目描述
给定一个正整数 n,计算其各位数字之和。
分析步骤
仔细阅读题目
输入:一个正整数 n。
输出:一个整数,表示 n 的各位数字之和。
提取数学关系
变量:n(输入的正整数)。
关系:将 n 的每一位数字提取出来并求和。
建立数学模型
定义变量:n。
建立方程:通过取模和整除操作提取每一位数字。
简化模型:使用循环逐步提取每一位数字并累加。
选择算法
算法:循环提取每一位数字并累加。
实现算法
伪代码:
初始化 sum = 0 当 n > 0 时: 提取 n 的最后一位数字 digit = n % 10 将 digit 加到 sum 中 去掉 n 的最后一位数字 n = n / 10 返回 sum
实际代码:
#include <iostream> using namespace std; int main() { int n; cin >> n; int sum = 0; while (n > 0) { int digit = n % 10; // 提取最后一位数字 sum += digit; // 累加到 sum 中 n /= 10; // 去掉最后一位数字 } cout << sum << endl; return 0; }
测试和验证
测试用例:
输入:
123
,输出:6
输入:
456
,输出:15
输入:
0
,输出:0
优化和调整
性能优化:当前算法已经足够高效,时间复杂度为 O(logn)。
代码优化:代码已经简洁明了,无需进一步优化。
总结
通过以上步骤,可以系统地分析算法题中的数学关系,并设计出高效的算法。