1001 Alice Game

题意:Alice和Bob玩游戏,初始有一个连续的串,对这个串进行两种操作:

1、当串的长度小于等于k时把这个串整体删除。

2、当这个串长度大于k时,将一个连续的长度为k的子串删除,并将原来的串分成不为空的两部分。

最后不能操作的人输,alice先手,问谁赢。

考点:博弈论

思路:sg函数打表,从题中可以看出,当n=0、n=k+1时sg=0,n<=k&&n!=0时sg=1,以此为初始条件打表,获得如下打表(k==5):

5 0 0?????  ---   ????
5 1 1
5 2 1
5 3 1
5 4 1
5 5 1
5 6 0?????  ---   ????
5 7 1
5 8 1
5 9 1
5 10 1
5 11 1
5 12 2
5 13 2
5 14 2
5 15 2
5 16 2
5 17 1
5 18 2
5 19 2
5 20 2
5 21 2
5 22 2
5 23 1
5 24 1
5 25 1
5 26 1
5 27 1
5 28 0?????  ---   ????
5 29 1
5 30 1
5 31 1
5 32 1
5 33 1
5 34 2
5 35 2
5 36 2
5 37 2
5 38 2
5 39 1
5 40 2
5 41 2
5 42 2
5 43 2
5 44 2
5 45 1
5 46 1
5 47 1
5 48 1
5 49 1
5 50 0?????  ---   ????
5 51 1
5 52 1
5 53 1
5 54 1
5 55 1
5 56 2
5 57 2
5 58 2
5 59 2
5 60 2
5 61 1
5 62 2
5 63 2
5 64 2
5 65 2
5 66 2
5 67 1
5 68 1
5 69 1
5 70 1
5 71 1
5 72 0?????  ---   ????
5 73 1
5 74 1
5 75 1
5 76 1
5 77 1
5 78 2
5 79 2
5 80 2
5 81 2
5 82 2
5 83 1
5 84 2
5 85 2
5 86 2
5 87 2
5 88 2
5 89 1
5 90 1
5 91 1
5 92 1
5 93 1
5 94 0?????  ---   ????
5 95 1
5 96 1
5 97 1
5 98 1
5 99 1
5 100 2
5 101 2
5 102 2
5 103 2
5 104 2
5 105 1
5 106 2
5 107 2
5 108 2
5 109 2
5 110 2
5 111 1
5 112 1
5 113 1
5 114 1
5 115 1
5 116 0?????  ---   ????
5 117 1
5 118 1
5 119 1
5 120 1
5 121 1
5 122 2
5 123 2
5 124 2
5 125 2
5 126 2
5 127 1
5 128 2
5 129 2
5 130 2
5 131 2
5 132 2
5 133 1
5 134 1
5 135 1
5 136 1
5 137 1
5 138 0?????  ---   ????
5 139 1
5 140 1
5 141 1
5 142 1
5 143 1
5 144 2
5 145 2
5 146 2
5 147 2
5 148 2
5 149 1
5 150 2
5 151 2
5 152 2
5 153 2
5 154 2
5 155 1
5 156 1
5 157 1
5 158 1
5 159 1
5 160 0?????  ---   ????
5 161 1
5 162 1
5 163 1
5 164 1
5 165 1
5 166 2
5 167 2
5 168 2
5 169 2
5 170 2
5 171 1
5 172 2
5 173 2
5 174 2
5 175 2
5 176 2
5 177 1
5 178 1
5 179 1
5 180 1
5 181 1
5 182 0?????  ---   ????
5 183 1
5 184 1
5 185 1
5 186 1
5 187 1
5 188 2
5 189 2
5 190 2
5 191 2
5 192 2
5 193 1
5 194 2
5 195 2
5 196 2
5 197 2
5 198 2
5 199 1
5 200 1
5 201 1
5 202 1
5 203 1
5 204 0?????  ---   ????
5 205 1
5 206 1
5 207 1
5 208 1
5 209 1
5 210 2
5 211 2
5 212 2
5 213 2
5 214 2
5 215 1
5 216 2
5 217 2
5 218 2
5 219 2
5 220 2
5 221 1
5 222 1
5 223 1
5 224 1
5 225 1
5 226 0?????  ---   ????
5 227 1
5 228 1
5 229 1
5 230 1
5 231 1
5 232 2
5 233 2
5 234 2
5 235 2
5 236 2
5 237 1
5 238 2
5 239 2
5 240 2
5 241 2
5 242 2
5 243 1
5 244 1
5 245 1
5 246 1
5 247 1
5 248 0?????  ---   ????
5 249 1
5 250 1
5 251 1
5 252 1
5 253 1
5 254 2
5 255 2
5 256 2
5 257 2
5 258 2
5 259 1
5 260 2
5 261 2
5 262 2
5 263 2
5 264 2
5 265 1
5 266 1
5 267 1
5 268 1
5 269 1
5 270 0?????  ---   ????
5 271 1
5 272 1
5 273 1
5 274 1
5 275 1
5 276 2
5 277 2
5 278 2
5 279 2
5 280 2
5 281 1
5 282 2
5 283 2
5 284 2
5 285 2
5 286 2
5 287 1
5 288 1
5 289 1
5 290 1
5 291 1
5 292 0?????  ---   ????
5 293 1
5 294 1
5 295 1
5 296 1
5 297 1
5 298 2
5 299 2
5 300 2
5 301 2
5 302 2
5 303 1
5 304 2
5 305 2
5 306 2
5 307 2
5 308 2
5 309 1
5 310 1
5 311 1
5 312 1
5 313 1
5 314 0?????  ---   ????
5 315 1
5 316 1
5 317 1
5 318 1
5 319 1
5 320 2
5 321 2
5 322 2
5 323 2
5 324 2
5 325 1
5 326 2
5 327 2
5 328 2
5 329 2
5 330 2
5 331 1
5 332 1
5 333 1
5 334 1
5 335 1
5 336 0?????  ---   ????
5 337 1
5 338 1
5 339 1
5 340 1
5 341 1
5 342 2
5 343 2
5 344 2
5 345 2
5 346 2
5 347 1
5 348 2
5 349 2
5 350 2
5 351 2
5 352 2
5 353 1
5 354 1
5 355 1
5 356 1
5 357 1
5 358 0?????  ---   ????
5 359 1
5 360 1
5 361 1
5 362 1
5 363 1
5 364 2
5 365 2
5 366 2
5 367 2
5 368 2
5 369 1
5 370 2
5 371 2
5 372 2
5 373 2
5 374 2
5 375 1
5 376 1
5 377 1
5 378 1
5 379 1
5 380 0?????  ---   ????
5 381 1
5 382 1
5 383 1
5 384 1
5 385 1
5 386 2
5 387 2
5 388 2
5 389 2
5 390 2
5 391 1
5 392 2
5 393 2
5 394 2
5 395 2
5 396 2
5 397 1
5 398 1
5 399 1
5 400 1
5 401 1
5 402 0?????  ---   ????
5 403 1
5 404 1
5 405 1
5 406 1
5 407 1
5 408 2
5 409 2
5 410 2
5 411 2
5 412 2
5 413 1
5 414 2
5 415 2
5 416 2
5 417 2
5 418 2
5 419 1
5 420 1
5 421 1
5 422 1
5 423 1
5 424 0?????  ---   ????
5 425 1
5 426 1
5 427 1
5 428 1
5 429 1
5 430 2
5 431 2
5 432 2
5 433 2
5 434 2
5 435 1
5 436 2
5 437 2
5 438 2
5 439 2
5 440 2
5 441 1
5 442 1
5 443 1
5 444 1
5 445 1
5 446 0?????  ---   ????
5 447 1
5 448 1
5 449 1
5 450 1
5 451 1
5 452 2
5 453 2
5 454 2
5 455 2
5 456 2
5 457 1
5 458 2
5 459 2
5 460 2
5 461 2
5 462 2
5 463 1
5 464 1
5 465 1
5 466 1
5 467 1
5 468 0?????  ---   ????
5 469 1
5 470 1
5 471 1
5 472 1
5 473 1
5 474 2
5 475 2
5 476 2
5 477 2
5 478 2
5 479 1
5 480 2
5 481 2
5 482 2
5 483 2
5 484 2
5 485 1
5 486 1
5 487 1
5 488 1
5 489 1
5 490 0?????  ---   ????
5 491 1
5 492 1
5 493 1
5 494 1
5 495 1
5 496 2
5 497 2
5 498 2
5 499 2
5 500 2

进程已结束,退出代码0
 

 可以发现除了n=0和n=k+1之外,所有的0的出现都是等距的,也就是每隔4*k+2就出现一次,然后就得出了规律,最后对每种情况特判即可

ac代码如下(打表的代码就是函数solve1):

#include<iostream>
#include<cstring>
#include<algorithm>
#include <map>
#include <vector>
#include <cmath>
#include <queue>
#include <set>

#define endl "\n"
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)

using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
#define int LL
const int N=1010,mod=998244353,INF=0x3f3f3f3f3f3f3f3f;

int n,k;
int sg[N];

int dfs(int now){
    int sg_now=0,flag=0;
    set<int> sg1;
    if(sg[now]>=0) return sg[now];
    for(int i=1;i+k<now;i++){
        sg_now=dfs(i)^dfs(now-i-k);
        sg1.insert(sg_now);
    }
    int x_sg=0;
    while(sg1.count(x_sg)){
        x_sg++;
    }
    sg[now]=x_sg;
    return sg[now];
}

void solve1(){
    cin>>k;
        for(n=0;n<=500;n++){
            memset(sg,-1,sizeof sg);
            for(int i=1;i<=k;i++) sg[i]=1;
            sg[0]=0,sg[k+1]=0;
            dfs(n);
            if(sg[n]==0) cout<<k<<" "<<n<<" "<<sg[n]<<"?????  ---   ????"<<endl;
            else cout<<k<<" "<<n<<" "<<sg[n]<<endl;
        }
    return ;
}

void solve(){
    cin>>k>>n;
    int tmp=n-(k+1);
    if(n==0){
        cout<<"Bob\n";
    }
    else if(n==k+1){
        cout<<"Bob\n";
    }
    else if(tmp%(4*k+2)==0){
        cout<<"Bob\n";
    }
    else cout<<"Alice\n";
}

signed main(){
    quick_cin();
    int t;
    cin>>t;
    //solve1();
    while(t--){
        solve();
    }

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值