原题链接:糖果游戏
解题思路:
可以把这个问题看作是一个循环分配的过程,由于是圆桌,1号和5号小朋友也是相邻的。可以利用数组来模拟每个小朋友手中的糖果数量,通过计算每个小朋友分配后的糖果情况,更新数组中的值。通过模运算对索引进行处理后,代码可以应对不同数量的小朋友,只需调整v.resize()的参数即可。
注意事项:
需要使用模运算来确保前后小朋友的索引循环。
这题可以选择把相邻这个条件分为左右两边分别处理,由于人数为5,索引为0-4。
则原索引为:01234
处理左边条件后的索引变为:40123
处理右边条件后的索引变为:12340
加上模运算后不难发现,处理左边条件后的索引可变为4%5 5%5 6%5 7%5 8%5。
再结合人数为5和原索引的信息可推:
左索引可变为:(5-1+0)%5 (5-1+1)%5 (5-1+2)%5 (5-1+3)%5 (5-1+4)%5
右索引可变为:(0+1)%5 (1+1)%5 (2+1)%5 (3+1)%5 (4+1)%5
这样做这两个索引就与相邻的两个小朋友是一一对应的,处理结束。
参考代码:
#include <iostream> #include <vector> #include <iomanip> using namespace std; int main() { vector<int> v; v.resize(5); for(int & index : v) { cin >> index; } for(int index=0; index<v.size(); index++) { v[index] /= 3; v[(v.size()-1+index)%v.size() ] += v[index]; // 给前一个小朋友 v[(index+1)%v.size()] += v[index]; // 给后一个小朋友 } for(int & index : v) { cout << setw(5) << setfill(' ') << index; } return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复