• Educational Codeforces Round 73 (Rated for Div. 2)E(思维,博弈)


    //这道题博弈的核心就是不能让后手有一段只能放b而长度不够放a的段,并且先手要放最后一次
    #define HAVE_STRUCT_TIMESPEC
    #include<bits/stdc++.h>
    using namespace std;
    int length[300007];
    int main(){
    ios::sync_with_stdio(false);//多组数据输入cin,cout容易超时
    cin.tie(NULL);
    cout.tie(NULL);
    int q;
    cin>>q;
    while(q--){
    int a,b;
    cin>>a>>b;
    string s;
    cin>>s;
    int n=s.size();
    int tmp=0;
    int cnt1=0,cnt2=0,cnt3=0;
    int len=0;
    for(int i=0;i<n;++i){
    if(s[i]=='.')
    ++tmp;
    else{//记录各个长度段的个数
    if(tmp>=b&&tmp<a)
    ++cnt1;
    else if(tmp>=a&&tmp<2*b)
    ++cnt2;
    else if(tmp>=2*b)
    ++cnt3,len=tmp;
    tmp=0;
    }
    }
    if(s[n-1]=='.'){//如果有最后一段不要忘了更新
    if(tmp>=b&&tmp<a)
    ++cnt1;
    else if(tmp>=a&&tmp<2*b)
    ++cnt2;
    else if(tmp>=2*b)
    ++cnt3,len=tmp;
    }
    if(cnt3>=2||cnt1)//如果有两段长度大于等于2b,后手可以把其中一段分割出一段长度为b留给自己最后一次放置a必输,且如果有一段长度b可以放a不能放先手必输
    cout<<"NO ";
    else if(!cnt3){//如果没有长度大于等于2b的段,每段都只能容许a或者b放一次
    if(cnt2&1)//如果段的个数为奇数先手必胜
    cout<<"YES ";
    else//偶数后手必胜
    cout<<"NO ";
    }
    else if(cnt2&1){//如果只有一段大于等于2b的话,并且a~2b-1长度段的个数为奇数
    if(len>=2*a&&len<a+3*b-1)//如果最长段的长度在这个范围内,先手可以把它分割成一段a~2b-1的段使得剩下所有长度段不是不够放b就是ab都可以放并且数量为偶数,此时后手必输
    cout<<"YES ";
    else//反之先手必输,只要先手不能必胜后手就有办法赢
    cout<<"NO ";
    }
    else{//如果只有一段大于等于2b的话,并且a~2b-1长度段的个数为偶数
    if(len<=a+2*b-2||len>=3*a&&len<a+4*b-1)//如果最长段的长度可以使a放置完后剩余段b都放不了,那么剩下偶数段可以放ab的先手会放最后一次,此时先手必胜,另一种情况是a放置完后可以把原本长度分割成两段,两段都可以放a并且不能放下两个b,如果让后手放置后使得一段只能放b而不能放a,后手必胜,所以此时先手必胜
    cout<<"YES ";
    else
    cout<<"NO ";
    }
    }
    return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    前端工程师必备:前端的模块化
    1414. 和为 K 的最少斐波那契数字数目(贪心)
    62. 不同路径(经典dp问题简单路径)
    1051. 高度检查器(排序比较)
    1144. 递减元素使数组呈锯齿状(两次扫)
    面试题 16.04. 井字游戏(模拟即可)
    微信小程序 base64ToArrayBuffer
    人人商城手机端添加控制器
    微擎自定义回复规则
    JS 对浏览器相关的操作
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11568895.html
Copyright © 2020-2023  润新知