C++ 小猫分鱼

思路


 

思路:

本题需要学会枚举算法

题目:M条鱼一只小猫把这堆鱼平均分为 N 份,多了i个 (M%N==i),拿走一份(M/N),下一只猫看到了M/N*(N-1)条。
如果你看到了K条鱼,那么些鱼是上一只猫留下的N-1份鱼,所以K必须被K%(N-1)整除,此时就可以推算出上一只猫当时看到了 K/(N-1)*N+i条鱼,否则枚举的方案不可行,放弃,进入下一次枚举
如果可以这样推导到第一只猫,那么这就是答案了

想要完成本题首先,我们要使用枚举找到一个最小的正整数 m(最后一只小猫会吃m条鱼),那么它当时应该看到了 m*n+i 条鱼,此时需要满足 m*n+i 能被 n-1 整除,这样就可以保证最后一只小猫分完鱼后,剩下的鱼是 n-1 的整数倍,逆推出之前小猫的当时看到的鱼 即 (m*n+i)/(n-1)*n

然后,我们要判断从倒数第二只小猫开始,每只小猫分鱼后,剩下的鱼是否还是 n-1 的整数倍,如果是,就说明这个 m 是满足要求的,否则,就要继续增加 m 的值,直到找到一个合适的 m。

最后,如果能够成功推导到第一只鱼看到的鱼的,那么此时的鱼的数量就是题目要求的答案,输出海滩上最少的鱼数(即逆推到的第一只猫看到的鱼,这就是第一只小猫分鱼前的鱼数)。

 
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,i;
  4. int main(){
  5. cin>>n>>i; // 输入小猫的数量 n 和每次扔掉的鱼的数量 i
  6. for(int m=1;;m++){ // 从 1 开始,不断增加 m 的值,直到找到一个满足要求的 m
  7. int k=n*m+i; // 计算第一只小猫分鱼前的鱼数,即 n*m+i
  8. bool flag=true; // 定义一个布尔变量,用来表示是否找到了满足要求的 m,初始为 true
  9. for(int j=2;j<=n;j++){ // 从第二只小猫开始,遍历每只小猫的编号 j
  10. if(k%(n-1)!=0){ // 如果 k 不能被 n-1 整除,说明这个 m 不满足要求
  11. flag=false; // 将 flag 设为 false
  12. break; // 跳出循环
  13. }
  14. k=k/(n-1)*n+i; // 如果 k 能被 n-1 整除,就更新 k 的值,即下一只小猫分鱼前的鱼数
  15. }
  16. if(flag){ // 如果 flag 为 true,说明这个 m 是满足要求的
  17. cout<<k<<"\n"; // 输出 k 的值,即海滩上最少的鱼数
  18. return 0; // 结束程序
  19. }
  20. }
  21. return 0;
  22. }
    思路

### C++ 中 `QJK` 的实现 在给定的上下文中,`QJK` 表示车辆 \( k \) 离开节点 \( i \) 时的装载量[^2]。为了展示如何在 C++ 中处理类似的逻辑,下面提供了一个简单的代码片段来模拟这一过程。 #### 定义结构体表示状态 ```cpp #include <iostream> #include <vector> struct VehicleState { int vehicleId; // 车辆编号 k std::vector<int> loadAtNode; // 各个节点上的载重量 Qik }; void updateLoad(VehicleState& state, int nodeId, int newLoad) { if (nodeId >= 0 && static_cast<size_t>(nodeId) < state.loadAtNode.size()) { state.loadAtNode[nodeId] = newLoad; } else { std::cerr << "Invalid node ID." << std::endl; } } int main() { const int numNodes = 5; VehicleState truck{1, std::vector<int>(numNodes)}; // 初始化各节点的载重情况 for(int i = 0; i < numNodes; ++i){ truck.loadAtNode[i] = i * 10; // 假设每到一个新站点增加一定货物数量 } // 更新特定节点的载重 updateLoad(truck, 2, 75); // 打印当前卡车的状态 for(size_t i = 0; i < truck.loadAtNode.size(); ++i){ std::cout << "Vehicle " << truck.vehicleId << ", Load at Node " << i << ": " << truck.loadAtNode[i] << std::endl; } return 0; } ``` 此程序定义了一个名为 `VehicleState` 的结构体用于存储单辆车的信息,包括其ID以及它在各个位置的载货量。函数 `updateLoad()` 可以用来更新指定节点处的载重量。最后,在主函数中创建了一辆具有五个停靠站的虚拟卡车,并对其进行了操作演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值