选择适当的枚举策略,使得无需枚举整层树就能得到解。
这题选择了优先使用刚得到的数,且先加法后减法。
这题选择了优先使用刚得到的数,且先加法后减法。
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define LL long long
#define mod 1000000007
#define INF 1000000007
#define eps 1e-5
#define PI 3.1415926535898
using namespace std;
//-------------------------CHC------------------------------//
int maxd;
int a[15] = { 1 };
int n;
bool dfs(int d) {
if (d == maxd) return a[d] == true;
int M = *max_element(a, a + d + 1);
if (M << (maxd - d) < n) return false;
for (int i = d; i >= 0; --i) {
a[d + 1] = a[d] + a[i];
if (dfs(d + 1)) return true;
a[d + 1] = a[d] - a[i];
if (dfs(d + 1)) return true;
}
return false;
}
int main() {
while (cin >> n && n) {
for (maxd = 0; ; ++maxd)
if (dfs(0)) break;
cout << maxd << endl;
}
return 0;
}
本文介绍了一种快速幂计算的策略,适用于ACM/ICPC比赛中的问题解决。通过优先使用最新得到的数值并优先尝试加法,然后减法,避免了完整枚举树的需要。提供了一个C++实现示例,该程序读取输入数值n,并通过深度优先搜索(DFS)找到满足条件的最大深度maxd。最后输出maxd作为解决方案。
359

被折叠的 条评论
为什么被折叠?



