這是一個spoj問題。它有效,但速度太慢。迭代差分
這裏有一個問題:
迭代差異
現在給你N個非負整數a(1),(2),..., 一個列表(N)。用新列表替換給定列表:新列表的第k個條目是a(k)-a(k + 1)的絕對值,在列表的末尾打包 (k- (N) - a(1))的絕對值爲 )。需要多少次迭代才能得到一個列表,其中每個條目都是相同的整數?
例如,讓N = 4
並從列表(0 2 5 11)
開始。連續迭代爲:
2 3 6 11
1 3 5 9
2 2 4 8
0 2 4 6
2 2 2 6
0 0 4 4
0 4 0 4
4 4 4 4
因此,在這個例子中需要8次迭代。
輸入
輸入將包含若干測試案例數據。對於每種情況, 將會有兩行輸入。第一行將包含 整數N(2 < = N < = 20),列表中的條目數。 第二行將包含整數列表,用空格隔開一個空格。輸入端將被N表示= 0
輸出
對於每一種情況,將有一行輸出,指定的情況下 數和迭代次數,在輸出示例 中顯示的格式。如果列表未在迭代1000 後達到所需表單,則打印「未達到」。
採樣輸入
4
0 2 5 11
5
0 2 5 11 3
4
300 8600 9000 4000
16
12 20 3 7 8 10 44 50 12 200 300 7 8 10 44 50
3
1 1 1
4
0 4 0 4
0
樣本輸出
Case 1: 8 iterations
Case 2: not attained
Case 3: 3 iterations
Case 4: 50 iterations
Case 5: 0 iterations
Case 6: 1 iterations
我不知道該怎麼做,使之更快。我嘗試使用數組,但是我嘗試分配內存並將一個數組設置爲另一個時遇到各種問題。
我該如何加快速度?這裏是我的代碼:
#include <iostream>
#include <vector>
#include <cmath>
#include <sstream>
#include <string>
using namespace std;
bool checker(vector<int>& nums2) {
int n = nums2[0];
for (int i = 1; i < nums2.size(); i++)
{
if (n != nums2[i])
return false;
}
return true;
}
vector<int> iterate(vector<int>& nums, int& iter, bool& attained) {
if (iter == 1000) {
attained = false;
return nums;
}
vector<int> nums2;
for (int i = 0; i < nums.size(); i++) {
if (i == nums.size() - 1)
nums2.push_back((int)abs((double)nums[i] - (double)nums[0]));
else
nums2.push_back((int)abs((double)nums[i] - (double)nums[i + 1]));
}
iter++;
return nums2;
}
int main()
{
int N = -1, count = 1;
while (1) {
int num = 0;
vector<int> nums;
string List = "";
stringstream ss;
cin >> N;
if (N == 0)
break;
cin.ignore();
cin.clear();
getline(cin, List);
ss << List;
while (ss >> num) {
nums.push_back(num);
}
int iterations = 0;
bool attained = true;
while (!checker(nums)) {
nums = iterate(nums, iterations, attained);
}
if (!attained)
cout << "case " << count << ": not attained";
else
cout << "case " << count << ": " << iterations << " iterations" << endl;
count++;
}
}
看起來完全像2011年的地區的[ACM-ICPC問題](https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3744)。 –
@TedHopp這並不奇怪,因爲SPOJ上的很多問題都以ICPC競賽爲源 –
請定義「太慢」 –