UESTC 878 温泉旅馆 --性质+枚举
2014-05-31 20:41
239 查看
设FA为A的牌中数字异或和,FB为B的。
则有性质:
ans = (所有的(A&B=0)个数 + (FA=FB且A&B=0)的个数)/2。即所有的FA>FB的个数(除2是因为这里FA>FB的个数等于FA<FB的个数)加上FA=FB(A&B=0)的个数(除2是因为会算两次),这些情况都算A赢。(FA=FB即有FA^FB = 0)可以定义状态dp[i][s]为考虑前i个数,当前FA^FB=s的(A,B)个数。我这里是直接算的。
代码:
View Code
则有性质:
ans = (所有的(A&B=0)个数 + (FA=FB且A&B=0)的个数)/2。即所有的FA>FB的个数(除2是因为这里FA>FB的个数等于FA<FB的个数)加上FA=FB(A&B=0)的个数(除2是因为会算两次),这些情况都算A赢。(FA=FB即有FA^FB = 0)可以定义状态dp[i][s]为考虑前i个数,当前FA^FB=s的(A,B)个数。我这里是直接算的。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 2007 int a[18]; int main() { int i,j,k,n,m,A; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); int S = (int)pow(3,n); //所有A&B=0的(A,B)个数 int AA = (1<<n) - 1; int cnt = 1; //A,B都不取 int resA; for(A=1;A<=AA;A++) { j = A; k = m = resA = 0; while(j) { if(j%2) { resA ^= a[k]; m++; } k++; j/=2; } if(resA == 0) //则可取A,B为resA的子集使FA^FB=resA=0,子集数为2^m(m为取得数的个数) cnt += 1<<m; } int res = (S+cnt)/2; printf("%d\n",res); return 0; }
View Code
相关文章推荐
- UESTC_温泉旅店 CDOJ 878
- UESTC - 878 温泉旅店 二维费用背包问题
- UESTC878————温泉旅店(动态规划)
- UVA 1649 Binomial coefficients( 二分 + 二项式的性质 + 枚举)
- jzoj4922 环 [性质、枚举答案、转换模型]
- UESTC 84 Binary Operations (dp+二进制枚举)
- UESTC 1251 谕神的密码【暴力枚举】
- D3D11_CREATE_DEVICE_FLAG枚举
- Codeforces Round #266 (Div.2) B Wonder Room --枚举
- hdu 2674(余数性质)
- Java高级特性之枚举
- CF 119D String Transformation(KMP,哈希,枚举,各种优化)
- enum可以没有枚举名
- HDU 5700——区间交——————【线段树+枚举】
- ACM 暴力枚举 Meeting with Aliens
- 取整函数及其性质
- Windows下如何枚举所有进程
- 2016 UESTC Traing Search Algorithm &String Problem N 简单的双向搜索
- C语言定义数组时使用枚举作为数组的下标
- 二叉查找树与红黑树概念性质及操作时间复杂度