uvaoj 10717 Mint 暴力枚举所有情况

来源:互联网 发布:vim node inspector 编辑:程序博客网 时间:2024/06/05 03:45
uvaoj 10717 Mint 暴力枚举所有情况
要建造桌子,每个桌子必须由四种不同类型的腿组成,每种腿的高度给出,可以叠加,现在给定一些类型的材料的高度和一个期望的桌子的高度,看看不超过这个高度的最大高度是多少,大于这个高度的最小高度是多少。
我们任选四个类型的材料,因为四个腿是一样的,所以,这四个材料组成的可能高度是这四个数的最小公倍数的倍数。数据量比较小,直接暴力枚举。这就差不多涉及到了枚举集合,可以使用类似产生排列的dfs写法,枚举写的时候,可以减少一层,我当时写的时候是多写了一层,就超时了。
代码如下:
/*************************************************************************> File Name: 10717.cpp> Author: gwq> Mail: gwq5210@qq.com > Created Time: 2015年01月06日 星期二 23时04分15秒 ************************************************************************/#include <cmath>#include <ctime>#include <cctype>#include <climits>#include <cstdio>#include <cstdlib>#include <cstring>#include <map>#include <set>#include <queue>#include <stack>#include <string>#include <vector>#include <sstream>#include <iostream>#include <algorithm>#define INF (INT_MAX / 10)#define clr(arr, val) memset(arr, val, sizeof(arr))#define pb push_back#define sz(a) ((int)(a).size())using namespace std;typedef set<int> si;typedef vector<int> vi;typedef map<int, int> mii;typedef long long ll;const double esp = 1e-5;#define N 55int num[N], val, lowwer, higher, x[4], n, t;int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}int lcm(int a, int b){return a / gcd(a, b) * b;}void solve(void){int p = x[0];for (int i = 0; i < 4; ++i) {p = lcm(p, x[i]);}int k = 0;while (p * (k + 1) < val) {++k;}int l, h;if (p * (k + 1) == val) {l = h = val;} else {l = p * k;h = p * (k + 1);}if (l > lowwer) {lowwer = l;}if (h < higher) {higher = h;}}// dfs从位置pos枚举剩下的元素,相当于从n个数中选出m个来void dfs(int pos, int cnt){if (cnt == 4) {solve();return;}for (int i = pos + 1; i <= n - 4 + cnt; ++i) {x[cnt] = num[i];dfs(i, cnt + 1);}}int main(int argc, char *argv[]){while (scanf("%d%d", &n, &t) != EOF) {if (n == 0 && t == 0) {break;}for (int i = 0; i < n; ++i) {scanf("%d", &num[i]);}for (int i = 0; i < t; ++i) {scanf("%d", &val);lowwer = -INF;higher = INF;for (int j = 0; j <= n - 4; ++j) {// 将第一层写在外边就过,写在里边就超时,写在里边增加了一层递归x[0] = num[j];dfs(j, 1);}printf("%d %d\n", lowwer, higher);}}return 0;}

参考:
1)http://blog.csdn.net/chuan6099/article/details/9397933
0 0