第一次接觸全是英語的題,怎麼會有這麼難的呢?
首先我拿起了它和中文的題目一對比,發現分成了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;
}