wtyblm


私信TA

用户名:dotcpp0804994

访问量:51

签 名:

等  级
排  名 26972
经  验 563
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

可以把这个问题看作是一个循环分配的过程,由于是圆桌,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 人评分

  评论区

  • «
  • »