一圈小孩做游戏
描述
有M个小孩子围成一圈做游戏,每个小孩子都有一个初始的号码。游戏有X步,每一步的操作方法都相同:每个小孩子把自己手上的号码改写成自己原来的号码加上右手边的小孩子的号码除以100的余数。请问你:经过X步之后,每个小孩子手上的号码是多少? 比如:有3个初始编号为{1,2,3}的小孩子,第一步操作完成之后,他们的编号变成了{1+2,2+3,3+1}即{3,5,4}。
输入
输入有N组测试数据。每组测试数据有2行: 第一行包含M和X。 第二行包含M个不超过100的整数。
输出
输出数据有N行,每行是一组测试数据的结果。注意:两个数字之间只有一个空格。
代码
include <cstring>
#include <iostream>
using namespace std;
int main()
{
int n,m,x,y;
int a[200000];
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> m >> x;
memset(a, 0, sizeof a);
for(int i = 1; i <= m; i++)
{
cin >> y;
a[i] = y;
}
for(int z = 1; z <= x; z++)
{
a[m + 1] = a[1];
for(int i = 1; i <= m; i++)
a[i] = a[i] + a[i + 1] % 100;
}
for(int i = 1; i <= m; i++)
cout << a[i] << " ";
cout << endl;
}
return 0;
}
思路
因为需要做几组数据的测试,所以最外层循环用来控制测试的组数,测试过程是一组接一组,输入应该写到外层循环中,并且用到了memset,其存在于cstring当中,它的作用就是清空数组,每测试完一组数据就清空一遍。假设有m个小孩,小孩是围成一圈加上题目给出的例子所以有a[m + 1] = a[1]。这样加下来按照题目要求利用循环计算即可。