必要に応じて指定された配列を生成します

int型の値Nを入力し、長さNの配列arrを作成して返します。
要件:任意のi <k <jについて、arr [i] + arr [j]!= arr [k] * 2を満たす

/* 思路:假定有一个数组满足上述条件,对这个数组进行奇变换和偶变换得到的数组同样符合条件,
        将奇变换和偶变换得到的数组合并到一起也是满足条件的 */

#include <iostream>
#include <vector>
using namespace std;

vector<int> makeArr(int size) {
    
    
	if (size <= 0) {
    
    
		return vector<int>();
	}
	if (size == 1) {
    
    
		return vector<int>(1, 1);
	}
	// 向上取整
	int halfSize = (size + 1) / 2;
	vector<int> base = makeArr(halfSize);
	vector<int> res;
	int index = 0;
	// 一半变为基数
	for (; index < halfSize; index++) {
    
    
		res.push_back(base.at(index) * 2 + 1);
	}
	// 另一半变成偶数
	for (; index < size; index++) {
    
    
		res.push_back(base.at(index - halfSize) * 2);
	}
	return res;
}

// 对生成的数组进行测试
bool testSample(vector<int>& arr) {
    
    
	if (arr.empty()) {
    
    
		return true;
	}
	for (int i = 0; i < arr.size(); i++) {
    
    
		for (int k = i + 1; k < arr.size(); k++) {
    
    
			for (int j = k + 1; j < arr.size(); j++) {
    
    
				if (arr.at(i) + arr.at(j) == arr.at(k) * 2) {
    
    
					return false;
				}
			}
		}
	}
	return true;
}

int main() {
    
    
	for (int i = 0; i < 1000; i++) {
    
    
		vector<int> arr = makeArr(i);
		if (!testSample(arr)) {
    
    
			cout << "false" << endl;
		}
	}

	system("pause");
	return 0;
}

侵害がある場合は、連絡して削除してください。エラーがある場合は、訂正してください。ありがとうございます。

おすすめ

転載: blog.csdn.net/xiao_ma_nong_last/article/details/105754687