这题看完本来以为是找规律的,可找了半天也没找出啥规律,翻了一下解题报告,说是搜索加剪枝,学了一下,就过了。
/* * hdu4016/win.cpp * Created on: 2012-11-9 * Author : ben */ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <iostream> #include <algorithm> #include <queue> #include <set> #include <map> #include <stack> #include <string> #include <vector> #include <deque> #include <list> #include <functional> #include <numeric> #include <cctype> using namespace std; typedef long long LL; const int MAXN = 42; const LL MAX = 0x7fffffffffffffffLL; int n, k; LL data[MAXN], ans, ands[MAXN]; void dfs(int now, int step, LL num) { if(num < ans) { ans = num; } if(now == n || step == k) return ; if((num & ands[now]) < ans) { dfs(now + 1, step + 1, num & data[now]); dfs(now + 1, step, num); } } int main() { #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif int T; scanf("%d", &T); for(int t = 1; t <= T; t++) { scanf("%d%d", &n, &k); for(int i = 0; i < n; i++) { scanf("%I64d", &data[i]); } sort(data, data + n); copy(data, data + n, ands); ands[n] = MAX; for(int i = n - 1; i >= 0; i--) { ands[i] &= ands[i + 1]; } ans = data[0]; dfs(0, 0, MAX); printf("Case #%d: %I64d\n", t, ans); } return 0; }