P2705 小球

记录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。

思路

刚看到题目的时候以为是一个多条件分支判断题,经过分析后,发现就是个数学公式题

  1. 不同的得分想要最大,不仅仅是单独考虑最大的,要考虑总分数
  2. 遍历所有得到分数的情况
  3. 每次遍历都进行一个打擂台来取出最大值

代码简析

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,计算其各位数字之和。

分析步骤
  1. 仔细阅读题目

    • 输入:一个正整数 n。

    • 输出:一个整数,表示 n 的各位数字之和。

  2. 提取数学关系

    • 变量:n(输入的正整数)。

    • 关系:将 n 的每一位数字提取出来并求和。

  3. 建立数学模型

    • 定义变量:n。

    • 建立方程:通过取模和整除操作提取每一位数字。

    • 简化模型:使用循环逐步提取每一位数字并累加。

  4. 选择算法

             算法:循环提取每一位数字并累加。

  5. 实现算法

    • 伪代码:

      初始化 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;
      }
  6. 测试和验证

    • 测试用例:

      • 输入:123,输出:6

      • 输入:456,输出:15

      • 输入:0,输出:0

  7. 优化和调整

    • 性能优化:当前算法已经足够高效,时间复杂度为 O(logn)。

    • 代码优化:代码已经简洁明了,无需进一步优化。

总结

通过以上步骤,可以系统地分析算法题中的数学关系,并设计出高效的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值