Complete the Sequence (生成完整序列数)第一次做英文c++的题


   第一次接触全是英语的题,怎么会有这么难的呢?
   首先我拿起了它和中文的题目一对比,发现分成了5个板块,将这5个板块细细拆分后,

了解到了大意,大意为输入n组数据,其中输入x个数,然后找出它的规律,输出接下来的y个数。比如一组数据,1、2、3、4、5、6,要输出剩下的数据,你肯定会不有毫不犹豫的回答。7、8。是的,这就是规律,但是有1组数据难倒了:它有9个1,还有一个2,然后它样例输出却是11,56。这道规律生生难倒了我,可是也只能硬着头皮往前做了,然后发现有一个规律,很深的规律。发现它是一个关于分差的问题,简单来说它是用后一个数减去前面一个数,得到差。然后把这组差继续用后一个数减去前一个数,直到只有最后一个差为止,然后分差就结束了。序列中的数就从0开始把它从最后一个分差的值慢慢往上加去。于是我利用差分算出了结果。可是还有一个问题,它总会时间超时,怎么办?我发现不仅要用分差,还得用到前缀的知识,然后思考了一会儿,终于把这道题攻破了,可真不容易。

具体解法如下:

include <bits/stdc++.h>

using namespace std;

int a[1005][1005];

int main()
{
int ans;
cin >> ans;
while(ans--)
{
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++)
cin >> a[0][i];
for(int i = 1; i < n; i ++ )
for(int j = 0; j < n - 1; j++)
a[i][j] = a[i - 1][j + 1] - a[i - 1][j];
for(int i = 1; i <= m; i++)
a[n - 1][i] = a[n - 1][0];
for(int i = n - 2; i >= 0; i--)
for(int j = 0; j < m; j++)
a[i][n - i + j] = a[i + 1][n - i + j - 1] + a[i][n- i + j - 1];
for(int i = 0; i < m - 1; i++)
cout << a[0][n + i] << " ";
cout << a[0][n + m - 1] << endl;
}
return 0;
}

posted on 2024-10-27 21:22  沈奕  阅读(37)  评论(0编辑  收藏  举报