(C++)[字节面试题]最大数(n如23121;给定数组a如[2 4 9]求由a中元素组成的小于n的最大数)All Passed

给定一个数n如23121;给定一组数字a如[2 4 9]求由a中元素组成的小于n的最大数。解法思路就是暴力递归,目前还没找到bad case,欢迎测试。

#include
#include
#include
#include
using namespace std;
const int N = 10010;
// 小于n 的最大数
vector<int> a;
int n, ans, target;
bool flag;
void dfs(int idx, int len, int cur, int last) {
	if (idx == len) {
		if (cur < target && cur != 0) {
			ans = max(ans, cur);
		}
		return;
	}
	for (int i = 0; i <= n; i++) {
		if (i == 0) {
			if(last == 0 && !flag) dfs(idx + 1, len, cur * 10 + a[i], a[i]);
			else continue;
		}
		else {
			flag = true;
			dfs(idx + 1, len, cur * 10 + a[i], a[i]);
			flag = false;
		}
	}
}
void stdInputs() {
	ans = -1;
	cin >> n;
	flag = false;
	a.resize(n+1, 0);
	for (int i = 1; i <= n; i++) cin >> a[i];
	cin >> target;
	int len = to_string(target).length();
	dfs(0, len, 0, 0);
	cout << ans;
}
void caseTest(vector<int> tmp, int x) {
	ans = -1;
	flag = false;
	target = x;
	n = tmp.size();
	tmp.insert(tmp.begin(), 0); // 为了处理0开头的情况
	a = tmp;
	dfs(0, to_string(target).length(), 0, 0);
	cout << "test case: ";
	for (int i = 1; i < a.size(); i++) cout << a[i] << " ";
	cout << " and x = " << target << ". The ans is: " << ans << endl;
}
int main() {
	caseTest({1, 2, 4, 9}, 2533); // 2499
	caseTest({ 1, 2, 4, 9 }, 2409); // 2299
	caseTest({ 1, 2, 4, 9 }, 1111); // 999
	caseTest({ 1, 2, 4, 9 }, 3000); // 2999
	caseTest({ 1, 2, 4, 9 }, 2100); // 1999
	caseTest({ 1, 2, 4, 9 }, 1249); // 1244
	caseTest({ 1, 2, 4, 9 }, 4921); // 4919
	caseTest({ 1, 2, 4, 9 }, 1); // -1
	caseTest({ 1, 2, 3 }, 101);
	caseTest({ 1, 2, 9 }, 1201); // 1121
	caseTest({ 1, 4, 9 }, 24132);
	caseTest({ 1, 4, 9 }, 14132);
	caseTest({ 2, 4, 5 }, 24131);
	caseTest({ 2, 4, 9 }, 23132); // 22999
	caseTest({ 2, 4, 9 }, 21132); // 9999
	caseTest({ 2, 4, 9 }, 24132); // 19999
	caseTest({ 2, 4, 9 }, 14132); // 14119
	caseTest({ 2, 3, 5 }, 3211);
	caseTest({ 6, 7, 8 }, 1200);
	caseTest({ 6, 9 }, 95); // 69
	return 0;
}

你可能感兴趣的:(c++,算法,深度优先)