【Problem 5】分饼干

题目

小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦某个位置的数字大于等于100就马上对100取模(比如某个位置变为103,就会自动变为3).现在给出这个魔力手环的构成,请你计算出使用k次魔力之后魔力手环的状态。

输入描述:

输入数据包括两行:
第一行为两个整数n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔
第二行为魔力手环初始的n个数,以空格分隔。范围都在0至99.

输出描述:

输出魔力手环使用k次之后的状态,以空格分隔,行末无空格。

输入例子:

3 2
1 2 3

输出例子:

8 9 7

解答

方法一

一开始直接按照题意模拟编程,但是由于k值过大,从而超时,牛客网上的通过率只有百分之六十。

#include <vector>
#include <iostream>using namespace std;int main(int argc, char *argv[])
{int n,k; cin >> n;cin >> k;vector<int> data(n);for (int i = 0; i < n; ++i){cin >> data[i];}for (int i = 0; i < k; ++i){int temp = data[0], n = data.size();for (int i = 0; i < n - 1; ++i){data[i] = (data[i] + data[i + 1]) % 100;}data[n - 1] = (data[n - 1] + temp) % 100;}for (int i = 0; i < n; ++i){(i == 0) ? cout << data[i] : cout << " " << data[i];}cout << endl;return 0;
}

方法二

后来参考了网上的解法,利用矩阵快速幂算法可以降低算法的复杂度。

将手环上的数字看做是一个只有一列的矩阵,如果一个手环上有5个数字,如果计算其变化k次后的结果,只需要左乘如下矩阵k次就可以了。

[1 1 0 0 0]
[0 1 1 0 0]
[0 0 1 1 0]
[0 0 0 1 1]
[1 0 0 0 1]

我们可以考虑使用矩阵快速幂算法,先计算如上矩阵进行k次幂运算后的结果,然后在和手环上的数字向量相乘。

# include <iostream>
# include <vector>
# include <algorithm>using namespace std;vector<vector<int>> multiMatrix(vector<vector<int>>& A, vector<vector<int>>& B)
{int n = A.size();vector<vector<int>> res(n, vector<int>(n));for (int i = 0; i < n; ++i){for (int j = 0; j < n; ++j){for (int k = 0; k < n; ++k){res[i][j] = (res[i][j] + A[i][k] * B[k][j ]) % 100;}}}return res;
}vector<vector<int>> getMatrixPower(vector<vector<int>>& A, int k)
{int n = A.size();vector<vector<int>> temp(n,vector<int>(n));for (int i = 0; i < n; ++i) { temp[i][i] = 1; }while (k){if (k % 2){temp = multiMatrix(temp, A);}k = k >> 1;A = multiMatrix(A, A);}return temp;
}vector<int> solve(vector<int>& data, int k)
{int n = data.size();vector<vector<int>> base(n, vector<int>(n));for (int i = 0; i < n; ++i){   base[i][i] = base[i][(i + 1) % n] = 1;}vector<vector<int>> targ = getMatrixPower(base, k);vector<int> res(n);for (int i = 0; i < n; ++i){int sum = 0;for (int j = 0; j < n; ++j){sum = (sum + targ[i][j] * data[j]) % 100;}res[i] = sum;}return res;
}int main(int argc, char *argv[])
{int n, k;cin >> n, cin >> k;vector<int> data(n);for (int i = 0; i < n; ++i) { cin >> data[i]; }data = solve(data, k);for (int i = 0; i < n; ++i){(i == 0) ? cout << data[i] : cout << " " << data[i];}cout << endl;
}

[网易2017实习生编程题] 魔力手环相关推荐

  1. 矩阵快速幂: 网易2017实习生编程题 魔力手环

    描述: 小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦 ...

  2. java在线编程题_阿里笔试题(2017在线编程题)-- 数串分组 --Java实现

    看到有人写了阿里的面试题,心里痒痒,好久 没搞过这些了,写着实现一下 题目 2017年3月阿里在线编程题(实习内推) 给定一串数字 判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字 ...

  3. 阿里笔试题(2017在线编程题)-- 数串分组 --Java实现

    看到有人写了阿里的面试题,心里痒痒,好久 没搞过这些了,写着实现一下 题目 2017年3月阿里在线编程题(实习内推) 给定一串数字 判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字 ...

  4. 网易校招基础编程题——计算炮击次数

    据说是校招的一道编程题,解题思路很简单,只需要一点基础的数学知识,但是需要注意测试样例有多组. 只需要简单的计算欧氏距离,与炮台射程进行比较即可. 代码实现如下: #include <iostr ...

  5. 网易2017实习生笔试6

    (编程题)小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣.一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数. 例如 : f(44) = 11. 现在给出一个N,需要 ...

  6. 网易有道编程题:恢复队列

    题目详情:给出一个含有n个元素的队列,其内容为1到n的无序整数,按照给定算法输出该队列,使得该队列依次输出1,2,3,-,n-1,n. 给定算法为: void outque(queue<int& ...

  7. 腾讯2017暑期实习生编程题(三题)

    总的来说,作为暑期实习生的题目,三题都不难,仔细思考都能顺利做出来 PS:我喜欢漂亮点的代码风格O(∩_∩)O 对于A题,求个逆序,再求最长公共子序列就可以了,这里回头还可以复习一下最长公共子串怎么求 ...

  8. 2016网易实习生编程题:n个骰子的和等于m

    题目 骰子的点数是1 到 6,当有n个骰子的时候,其点数和等于m的数量 如当n = 4 m = 23时候 有下面四种: 5666 6566 6656 6665 解题 深度优先,开始第一感觉很复杂,然后 ...

  9. 2017春季华为实习生编程题

    题目有三道,个人感觉比较简单,这里简单的说一下: 1.第一道:将输入的字符串中的大写字母转小写输出,错误的字符不管(除大小写之外的都是错误的). 1 #include <stdio.h> ...

最新文章

  1. JavaScript常见集合操作
  2. 杭电1754--I Hate It(线段树)
  3. c 输出空格_Python编程:案例详解输出函数print
  4. kaggle (自杀分析)
  5. ITK:读写矢量图像
  6. spring配置详解-模块化配置
  7. java中push和pop指令的作用_汇编语言PUSH和POP指令(压栈和出栈)
  8. python 堆栈_利用Python列表实现堆栈(二):实现
  9. 【Python】PyMySQL 连接 MySQL数据库
  10. uView u-button修改样式
  11. 常用的php.ini 配置选项
  12. IBM大中华区总架构师讲述话说程序员的职业生涯
  13. js自写字符串 append 方法
  14. nohub java -jar xx.jar /dev/null 21 以及/dev/null是什么 21又是什么?
  15. wget 网页爬虫,网页抓取工具
  16. 阿铭Linux_网站维护学习笔记201903021
  17. 【obs】27:deps 构建说明及studio的vs2019构建及裁剪
  18. [渝粤教育] 西南科技大学 汉语写作 在线考试复习资料
  19. Learning Git Branching笔记总结
  20. 【实战】(字节跳动、日本东京大学)学习使用白盒表示+GAN来创作卡通图片:Learning to Cartoonize Using White-Box Cartoon Representations

热门文章

  1. bmc网络配置_SA5212M5-BMC设置
  2. mysql多表sumif_MySQL与EXCEL sum sumif sumifs 函数结合_品牌汇总_20161101
  3. 大疆Tello EDU版本(新发布)
  4. 使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小
  5. 微支付基础:信任的成本
  6. ORACLE的sql语句查询一对一,一对多,多对多
  7. Java高效率复习-面向对象下篇[Java]
  8. 大一计算机基础excel文档,大一计算机应用基础办公自动化软件深入Excel复习用PPT课件.ppt...
  9. 世界上最有名的十大思想实验
  10. c语言学生信息结构体录入文件,C语言—学生信息管理系统