联想算法题-小朋友分糖果

简介: 联想算法题-小朋友分糖果

联想算法题-小朋友分糖果

问题描述

有n个小朋友围成一圈,假设他们的编号分别为1,2,…,n,编号为i与编号为i+1(1<=i<n)的小朋友互为相邻关系,特别地,编号为1与编号为n的小朋友也互为相邻关系。

每个小朋友都带了一些糖果[a_1,a_2,…,a_n],a_i表示第i个小朋友带的糖果数量。现在老师带着他们做一个这样的游戏:每当老师喊“交换”时,所有的小朋友都会将自己当前手上的糖果分给相邻的小朋友:如果手上糖果的数量是偶数,则平分给左右两个相邻的小朋友;如果手上糖果的数量是奇数,那么自己留下1个糖果,再将剩下的糖果评分给左右两个相邻的小朋友。

在老师喊了k次“交换”后,每个小朋友需要报告自己手上的糖果数量。

例如当n=4且k=3时,假设一开始小朋友带的糖果数量为[2,3,5,4],那么进行3次“交换”后糖果数量情况为:[2,3,5,4]=>[3,4,4,3]=>[4,3,3,4]=>[3,4,4,3]。

0 4 5 5

2 0 7 5

2 3 1 8

6 3 5 0

输入描述

第一行两个正整数n和k,分别表示小朋友的数量和要进行“交换”的次数。

第二行n个整数a_1,a_2,…,a_n,其中a_i表示编号为i的小朋友带的糖果数量。

输出描述

一行n个用空格隔开的数b_1,b_2,…b_n,其中b_i表示编号为i的小朋友最终手上的糖果数量。

输入样例1

4 3

2 3 5 4

输出样例1

3 4 4 3

样例解释1

如题面描述中所示。

数据范围和说明

30%的数据保证:3<=n<=10, 1<=k<=100, 0<=a_i<=100

80%的数据保证:3<=n<=100, 1<=k<=100, 0<=a_i<=100

100%的数据保证 :3<=n<=500, 1<=k<=1000, 0<=a_i<=100

算法思路:

这个算法思路是模拟,但是重点在于,一定要创建新的数据,如果直接在原数组基础上进行操作,会出现

问题,原因是他们是同时操作的,而不是从第一个开始到最后一个,如果是从第一个到最后一个这样的顺序,那么就是第二种写法。

#include <iostream>
#include <vector>
using namespace std;
vector<int> candy_game(int n, vector<int>& candies, int k) {
    for (int t = 0; t < k; ++t) {
        vector<int> new_candies(n, 0);  // 用于存储每次交换后的糖果数量
        for (int i = 0; i < n; ++i) {
            if (candies[i] % 2 == 0) {
                // 如果糖果数量为偶数,平分给左右两个相邻的小朋友
                new_candies[(i + n - 1) % n] += candies[i] / 2;
                new_candies[(i + 1) % n] += candies[i] / 2;
            } else {
                // 如果糖果数量为奇数,保留1个,再平分给左右两个相邻的小朋友
                new_candies[(i + n - 1) % n] += candies[i] / 2;
                new_candies[i] += 1;
                new_candies[(i + 1) % n] += candies[i] / 2;
            }
        }
        candies = new_candies;
    }
    return candies;
}
int main() {
    int n, k;
    cin >> n >> k;
    vector<int> candies(n);
    for (int i = 0; i < n; ++i) {
        cin >> candies[i];
    }
    // 输出最终糖果数量
    vector<int> result = candy_game(n, candies, k);
    for (int i = 0; i < n; ++i) {
        cout << result[i] << " ";
    }
    return 0;
}

非同时的情况的代码写法

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n, k;
    vector<int> q;
    cin >> n >> k;
    for (int i = 0; i < n; ++ i)
    {
        int t;
        cin >> t;
        q.push_back(t);
    }
    while(k --)
    {
        for (int i = 0; i < n; ++ i)
        {
            int t = q[i] / 2;
            if (q[i] % 2 == 0) q[i] = 0;
            else q[i] = 1;
            q[(i + n - 1) % n] += t;
            q[(i + 1) % n] += t;
        }   
    }
    for (int i = 0; i < n; ++ i) cout << q[i] << " ";
    return 0;
}

测试用例

4 3
2 3 5 4

运行结果

6 4 3 1
相关文章
|
7月前
|
设计模式 算法 Java
【数据结构和算法】拥有最多糖果的孩子
给你一个数组candies和一个整数extraCandies,其中candies[i]代表第i个孩子拥有的糖果数目。对每一个孩子,检查是否存在一种方案,将额外的extraCandies个糖果分配给孩子们之后,此孩子有最多的糖果。注意,允许有多个孩子同时拥有最多的糖果数目。
59 1
|
算法 测试技术 C++
C++算法:分发糖果
C++算法:分发糖果
|
6月前
|
存储 算法 数据可视化
如何使用多种算法解决LeetCode第135题——分发糖果问题
如何使用多种算法解决LeetCode第135题——分发糖果问题
|
6月前
|
算法 Java Go
【经典算法】LeetCode 1103 分糖果 II(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 1103 分糖果 II(Java/C/Python3实现含注释说明,Easy)
92 0
|
7月前
|
算法
联想算法题-搬砖人
联想算法题-搬砖人
51 1
|
7月前
|
算法
联想算法题-石头剪刀布
联想算法题-石头剪刀布
100 0
|
7月前
|
算法
联想算法题-发牌序列
联想算法题-发牌序列
38 0
|
7月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 135. 分发糖果 算法解析
☆打卡算法☆LeetCode 135. 分发糖果 算法解析
|
算法 网络架构
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
62 0
算法训练Day34|1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
算法训练Day34|1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
下一篇
DataWorks