UESTC_温泉旅店 CDOJ 878

天空飘下一朵一朵的雪花,这是一片纯白的世界。

在天空之下的温泉旅店里,雪菜已醉倒在一旁,冬马与春希看了看说着梦话的雪菜,决定找一点玩的来度过这愉快的晚上。

这家旅店提供一种特色游戏,游戏有n张牌,各写有一个数字,数字可能相同也可能不同,冬马和春希都可以从中拿出任意张(也可以不拿,被其中一个人拿过的牌,另一个人肯定是拿不了了。),各自的得分为他们手中牌上的数字的异或和。

春希身为一个男孩子,觉得自己理应让下女孩子,决定只有自己的得分大于冬马的时候才算自己赢,不过多管闲事的他还是想知道有多少种拿法,能让冬马赢。

Input

第一行为一个整数n,表示牌的数量。(1≤n≤16)

第二行n个整数,ai表示第i张牌的数字。(0≤ai≤100)

Output

一个整数,表示冬马能赢过春希的方案数。

Sample input and output

Sample Input Sample Output
2
55 68
5

解题报告

简单dp,f(i,j)表示冬马为i分,春希为j分的方案数

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
typedef long long ll;
using namespace std;
const int maxn = 100 + 15;
int dp[16+5][maxn+50][maxn+50],A[16+5];

int main(int argc,char * argv[])
{
  int n;
  cin >> n;
  for(int i = 1 ; i <= n ; ++ i)  cin >> A[i];
  memset(dp,0,sizeof(dp));
  ll ans = 0;
  dp[0][0][0] = 1;
  for(int i = 1 ; i <= 16 ; ++ i)
   for(int j = 0 ; j <= 128 ; ++ j)
    for(int k = 0 ; k <= 128 ; ++ k)
     {
        dp[i][j][k] += dp[i-1][j][k];
         dp[i][j^A[i]][k] += dp[i-1][j][k];
         dp[i][j][k^A[i]] += dp[i-1][j][k];
     }
  for(int i = 0 ; i <= 128 ; ++ i)
   for(int j = 0 ; j <= 128 ; ++ j)
    if (i >= j)
     ans += dp[n][i][j];
  cout << ans << endl;
  return 0;
}
时间: 2024-10-16 14:37:32

UESTC_温泉旅店 CDOJ 878的相关文章

UESTC - 878 温泉旅店 二维费用背包问题

http://acm.uestc.edu.cn/#/problem/show/878 设dp[i][j][k]表示在前i个数中,第一个得到的异或值是j,第二个人得到的异或值是k的方案数有多少种. 因为异或后的大小不确定,所以不能压缩数组,但是也不大..可以过. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm>

UESTC_贪吃蛇 CDOJ 709

相信大家都玩过贪吃蛇游戏吧. 在n×m的迷宫中,有着一条长度不超过9的贪吃蛇,它已经将所有的食物吃光了,现在的目标是移动到出口. 它走的时候不能碰到自己的身体,也不能碰到墙壁.(如果贪吃蛇的长度>3并且下一步要走到自己的尾部,是合法的) 问它能不能走到出口,如果能,最少要移动几步? Input 数据包含多组数据,请读入到文件末尾EOF 每组数据第一行包含两个整数n,m(1≤n,m≤15)代表迷宫的大小. 接下来n行,每行包含一个长度为m的字符串,来表示迷宫. 字符串中仅包含..#.@.1 ~ 9

UESTC_魔法少女小蟹 CDOJ 710

小蟹是一名魔法少女,能熟练的施放很多魔法. 有一天魔法学院上课的时候出现了这样一道题,给一个6位数,让大家用自己的魔法,把这个6位数变成另一个给定的6位数. 小蟹翻了下魔法书,发现她有以下6种魔法: 将当前魔杖指向的数字与最左端的一个数字调换位置. 将当前魔杖指向的数字与最右端的一个数字调换位置. 将当前魔杖指向的数字+1.(若当前魔杖指向的数字为9则无效) 将当前魔杖指向的数字−1.(若当前魔杖指向的数字为0则无效) 将当前魔杖向右移动一位. 将当前魔杖向左移动一位. 最开始,她的魔杖指向的是

UESTC_摩天轮 CDOJ 879

一天,冬马被春希和雪菜拉着去一起去游乐园玩. 经过了各种过山车的洗礼后,三人决定去坐摩天轮休息下. 这是一个巨大的摩天轮,每一个车厢能坐任意多的人.现在,等着坐摩天轮的有n个人(包含他们3人),摩天轮还有m个车厢可以坐人.每个人都有自己肥胖程度,出于某些原因,胖子和瘦子坐在同一节车厢就会产生一定的矛盾,这个矛盾的值为(MAX−MIN)2,其中MAX为当前车厢里面最胖的人的肥胖程度,MIN为最廋的那个人的肥胖程度. 爱管闲事的春希当然不希望就因为这点小事而使大家的这趟旅途不愉快,于是他决定帮大家安

UESTC 878 温泉旅馆

设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)个数.我这里是直接算的. 代码: #include <ios

UESTC_方老师的分身 II CDOJ 915

方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师计算出了走路时间最长的那个分身所用的时间.于是有个特殊的分身(据说是方老师真身!)就不想如此古板的走最短路了!由于这个分身的特殊性,这个分身对于单向边可以当双向边走.但是这个特殊的分身想走最短路的同时,要求至少经过k条边. Input 有多组数据 第一行两个整数n,m(1≤n

UESTC_敢说就敢做 CDOJ 631

敢说就敢做 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status beap总是自诩敢说又敢做,又到了情人节,为了体现自己的勇气可嘉,beap决定给自己喜欢的女生买玫瑰花,以此表达自己的爱意.到花店里,他发现一共有K种花,同时他从网上得知,送N朵花的花语是LOVE,所以他决定在所有的花里面选N朵出来送给心爱的女生,但是又为了显示自己买了那么多种花,他决定这K

UESTC_握手 CDOJ 913

握手 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 一群人参加了一次聚会,其中有一些人是好朋友.一对朋友见面后握手且仅握一次手,并且每个人不会和自己握手(废话!).现在告诉你每个人一共握了几次手,请你判断是否存在一种朋友关系满足每个人的握手数. Input 输入多组数据,第一行一个数T,表述数据组数.每组数据第一行输入一个数n,表示有n个人参加了聚

UESTC_我要长高 CDOJ 594

韩父有N个儿子,分别是韩一,韩二…韩N.由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万.舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火火,嫉妒心遂起,便发微薄调侃韩二们站成一列时身高参差不齐.由于舟子的影响力,随口一句便会造成韩家的巨大损失,具体亏损是这样计算的,韩一,韩二…韩N站成一排,损失即为C×(韩i与韩i+1的高度差(1≤i<N))之和,搞不好连女儿都赔了.韩父苦苦思索,决定给韩子们内增高(注意韩子们变矮是不科学的只能增高