hdu 2999Stone Game, Why are you always there?

 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2999

题意:先给定可操作数的集合(有重复),每次操作必须拿集合中到数且是连续的, 不能操作为负; 然后有M次询问, 每次总数为k的石头;

思路: 通过求sg函数,枚举下一个状态,sg=0则为必败点, 数据量有点大, 要注意姿势,不然会 T;

View Code
 1 #include <cstring>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int N, M, L, k;
 6 int a[1005];
 7 int sg[1005];
 8 int mex(int x)
 9 {
10     if(sg[x]!=-1)return sg[x];
11     bool re[1005]={0};
12     for( int i=0; i<L&& a[i]<=x; ++ i ){
13         for( int j=0; j+a[i]<=x; ++ j ){
14             re[mex(j)^mex(x-j-a[i])]=1;
15         }
16     }
17     int i=0;
18     while( re[i] )i++;
19     return sg[x]=i;
20 }
21 int main()
22 {
23     while( scanf("%d", &N)==1 ){
24         for(int i=0; i<N; ++ i){
25             scanf("%d", &a[i]);
26         }
27         sort(a, a+N);
28         L=1;
29         for( int i=1; i<N; ++ i ){
30             if( a[i]!=a[i-1] )
31                 a[L++]=a[i];
32         }
33         scanf("%d", &M);
34         memset(sg, -1, sizeof(sg));
35         for( int i=0; i<M; ++ i ){
36             scanf( "%d", &k );
37             if(mex(k))puts("1");
38             else puts("2");
39         }
40     }
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/jian1573/archive/2013/05/01/3053169.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值