Balancing the Scale

来源:互联网 发布:千牛淘宝修改店铺名称 编辑:程序博客网 时间:2024/06/01 11:21

the main algorithm:

use a array to save the number of the combination(use the way of combination as flag) and multiply the i ans 1<<16-1^i to calculate the total number of this way

code:

#include<cstdio>#include<iostream>#include<algorithm>#include<vector>#include<cstring>using namespace std;int num[16];const int M = 12000;const int N = (1<<16);vector<int> sta[M];//connect the sum and combination, a certain sum reflect to many ways int cnt[N], x[16];void init() {sort(num, num+16);for(int i=0; i<M; i++) sta[i].clear();memset(cnt, 0, sizeof(cnt));}bool judge(int s) {int count = 0;for(int i=0; i<16; i++) {if(s & 1<<i) x[count++] = num[i];}return count==4;}long long deal() {long long ans = 0;int t;for(int i=0; i<N; i++) {if(judge(i))do{//make sure there are four num t = x[0]*4+x[1]*3+x[2]*2+x[3];for(int k=0; k<sta[t].size(); k++) {if((sta[t][k] & i) == 0) {//al long as them are not samecnt[sta[t][k]|i]++;//use the way as a flag}}sta[t].push_back(i);}while(next_permutation(x, x+4));}for(int i=0; i<N; i++) {ans += cnt[i]*cnt[i^(N-1)];}return ans/2;}int main() {int cas = 1;while(scanf("%d", &num[0]) == 1 && num[0]) {for(int i=1; i<16; i++) scanf("%d", &num[i]);init();printf("Case %d: %lld\n", cas++, deal());}return 0;}


0 0
原创粉丝点击