题解 | #石子游戏#

石子游戏

http://www.nowcoder.com/practice/fe03f011e6c44a8ca76ca15a5e1c6d87

  1. 按道理是应该用贪心的思想去做(实验的时候也是这样的),但是我们可以换种思路,通过实验然后对原数组不变(不需要移除元素),进行1. 数组折半后的奇数偶数。2. 相同堆有几对。3. 如果是奇数要易主。 4. 如果two==2 或者 cnt[i]==3铁定自己输对方赢。来通过这些规律来判断。
#include <bits/stdc++.h>
using namespace std;

string solve(vector<int>& stones){
    unordered_map<int,int> cnt;//存储数量

    int two = 0;// 有两个堆石子相等的对数

    bool x = stones.size()/2 & 1; //默认我的赢家为x(这个和石子堆的奇数偶数性质有关(总结出来的))

    for(int i :stones){
        cnt[i]++;//记录堆中相同数量堆的出现次数

        if(cnt[i]==2) two++;//出现了一对,所以加1

        // two==2(有两堆相同的了), 先手无论如何取,第一次取完最少仍有一组石子数相同的石堆
        // cnt[i]==3同理(有三个数都同了,那么必然2个数相同),因此先手输,woman赢
        if(two==2||cnt[i]==3){
            return "woman";
        }

        if(i&1) x = !x;//如果遇到奇数个石头,进行转换。赢家(规律总结)


    }

    return x? "man" : "woman";


}



int main(){

    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;

        vector<int> stones(n);//初始化方式值得学习
        //注意,根据规则,所有都是0,必输
        bool isAllZero = true;

        for(int i =0; i <n; i++){
            cin>>stones[i];
            //注意,根据规则,如果遇到一个不是0
            if(stones[i]) isAllZero =false;

        }

        if(isAllZero){
            cout<<"woman"<<endl;
        }else{
            cout<<solve(stones)<<endl;
        }

    }

    return 0;

}

大厂笔试题题解 文章被收录于专栏

主要是公司笔试题得一些总结

全部评论
请问奇数易主怎么理解?
点赞 回复 分享
发布于 2023-03-11 16:59 北京

相关推荐

点赞 评论 收藏
分享
兄弟们,实习都是在接各种api,该怎么包装简历
仁者伍敌:感觉我自己做小项目也是各种api啊,我要怎么包装简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务