欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
【题目来源】
洛谷:[B3925 GESP202312 三级] 小猫分鱼 - 洛谷
【题目描述】
海滩上有一堆鱼,N NN只小猫来分。第一只小猫把这堆鱼平均分为N NN份,多了i < N i<Ni<N个,这只小猫把多的i ii个扔入海中,拿走了一份。第二只小猫接着把剩下的鱼平均分成N NN份,又多了i ii个,小猫同样把多的i ii个扔入海中,拿走了一份。第三、第四、……,第N NN只小猫仍是最终剩下的鱼分成N NN份,扔掉多了的i ii个,并拿走一份。
编写程序,输入小猫的数量N NN以及每次扔到海里的鱼的数量i ii,输出海滩上最少的鱼数,使得每只小猫都可吃到鱼。
例如:两只小猫来分鱼N = 2 N=2N=2,每次扔掉鱼的数量为i = 1 i=1i=1,为了每只小猫都可吃到鱼,可令第二只小猫需要拿走1 11条鱼,则此时待分配的有3 33条鱼。第一只小猫待分配的鱼有3 × 2 + 1 = 7 3\times 2+1=73×2+1=7条。
【输入】
总共2 22行。第一行一个整数N NN,第二行一个整数i ii。
保证0 < N < 10 0<N<100<N<10;i < N i<Ni<N。
【输出】
一行一个整数,表示满足要求的海滩上最少的鱼数。
【输入样例】
2 1【输出样例】
7【算法标签】
《洛谷 B3925 小猫分鱼》 #GESP# #2023#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;intn,i;// n: 总人数, i: 最后一个人的编号/** * 检查给定的s(分给第一个人的数量)是否有效 * 并计算最后剩下的人数 * @param s 分给第一个人的数量 * @return 如果有效返回最后人数,否则返回0 */intcheck(ints){// 第一次分配后剩下的人数intk=s*n+i;// 模拟n-1次分配(因为第一次已经分配了)for(intx=2;x<=n;x++){// 检查是否能被n-1整除if(k%(n-1)!=0){return0;// 不能整除,无效}// 更新k为下一次分配前的人数k=k/(n-1)*n+i;}// 返回最后剩下的人数returnk;}intmain(){// 输入总人数n和最后一个人的编号icin>>n>>i;// 特殊情况:n=1if(n==1){cout<<1<<endl;// 只有一个人,分给自己return0;}// 从s=1开始尝试ints=1;while(true){intans=check(s);if(ans>0)// 找到有效解{cout<<ans<<endl;break;}s++;// 尝试下一个s}return0;}【运行结果】
2 1 7