hihocoder 第280周德国心脏病c++

#题目:

 

Jack在和朋友们玩德国心脏病。

德国心脏病的游戏牌分为水果牌和动物牌。水果只有4种:香蕉、草莓、樱桃、柠檬,每张水果牌上会有种类不定、总数目1-5的水果;动物只有3种:猴子、大象、猪,每张动物牌上有且仅有一只动物。

n名玩家绕圈就座,第一轮游戏从0号至n-1号轮流出牌。每个玩家面前最多只有一张牌,如果玩家出牌时,他的面前已经摆放了一张牌,他新出的牌将会严丝合缝地盖住旧牌。

任何时候玩家可以选择按铃操作。如果按铃成功,玩家可以获得当前场上所有牌(包括被盖住的牌)并进入下一轮游戏,下一轮游戏由他先出牌,然后依序轮流出牌;否则,他需要支付给每位玩家一张手牌,然后他成为下一位出牌者,继续这一局游戏。

按铃成功的条件:

1、当前场上(被盖住的牌不算,以下同)某种水果的数量正好为5。

2、当前场上出现猴子,至少有一个水果,且没有出现柠檬。

3、当前场上出现大象,至少有一个水果,且没有出现草莓。

4、当前场上出现猪,且至少有一个水果。

Bob对这个游戏很感兴趣,他给了Jack一个操作序列,希望Jack输出最终每个人拥有的牌的数量。每名玩家初始拥有10,000,000张牌。操作分为两种:出牌或按铃。操作结束时游戏立即终止。

1、出牌的格式是:Fruit+水果数s+水果种类*s,0、1、2、3分别表示香蕉、草莓、樱桃、柠檬。如Fruit 4 0 2 2 2代表1个香蕉和3个樱桃的牌。或Animal+动物种类,0、1、2分别代表猴子、大象、猪。如Animal 0代表一张猴子牌。注意,选手需要自己计算出牌者是几号玩家。

2、按铃的格式是:Ring+选手编号。如Ring 2。

输入

第一行两个正整数n(≤10), k(≤100,000)。

接下来k行,每行对应一个操作。

输出

n行,每行一个整数,代表每个玩家游戏结束后拥有的牌的数目。

样例解释

3 13 			# 井号后为样例输入说明:3名玩家,13次操作
Fruit 5 0 0 0 0 0	# 0号玩家出牌:5个香蕉
Ring 0 			# 0号玩家按铃:按铃成功,获得场上的1张牌,开始下一轮游戏
Ring 1 			# 1号玩家按铃:按铃失败,给0, 2号玩家各一张牌
Fruit 3 3 0 0	 	# 1号玩家出牌:1个柠檬+2个香蕉
Animal 0 		# 2号玩家出牌:猴子
Fruit 4 2 2 2 2 	# 0号玩家出牌:4个樱桃
Ring 2 			# 2号玩家按铃:按铃失败,给0, 1号玩家各一张牌
Fruit 3 0 0 0		# 2号玩家出牌:3个香蕉,盖住上一张牌【猴子】
Fruit 2 0 0 		# 0号玩家出牌:2个香蕉,盖住上一张牌【4个樱桃】
Ring 2 			# 2号玩家按铃:按铃失败,给0, 1号玩家各一张牌
Animal 2 		# 2号玩家出牌:猪,盖住上一张牌【3个香蕉】
Ring 0			# 0号玩家按铃:按铃成功,获得场上的6张牌,开始下一轮游戏
Animal 2		# 0号玩家出牌:猪,游戏终止

样例输入

3 13
Fruit 5 0 0 0 0 0
Ring 0
Ring 1
Fruit 3 3 0 0
Animal 0
Fruit 4 2 2 2 2
Ring 2
Fruit 3 0 0 0
Fruit 2 0 0
Ring 2
Animal 2
Ring 0
Animal 2

样例输出

10000006
9999999
9999994

#思路

没有什么特别高深的算法,就是要仔细认真,注意细节,提交了很多次,都是小地方出错了,按照题目给的逻辑写就行了,具体可以看代码。

#code

#include<iostream>
#include <numeric>
#include<vector>
#include<string>
using namespace std;
bool panduan(vector<vector<int>>& Fruit,vector<vector<int>>& Animal)//判断是否按铃成功
{
    vector<int>a(4,0);
    vector<int>b(3,0);
    for(int i=0;i< Fruit.size();++i)
    {
        for(int j=0;j< Fruit[i].size();++j)
            a[j]+=Fruit[i][j];
    }
    for(int i=0;i<Animal.size();++i)
    {
        for(int j=0;j<Animal[i].size();++j)
            b[j]+=Animal[i][j];
    }
    for(int i=0;i<a.size();++i)
        {
            if(a[i]==5)
                return true;
        }
    if(b[0]>0)
    {
        if(accumulate(a.begin(),a.end(),0)>0&&a[3]==0)
            return true;
    }
    if(b[1]>0)
    {
        if(accumulate(a.begin(),a.end(),0)>0&&a[1]==0)
            return true;
    }
    if(b[2]>0)
    {
        if(accumulate(a.begin(),a.end(),0)>0)
            return true;
    }
    return false;
}
int main()
{
    
    int num=0;
    int turn =0;
    cin>>num>>turn;
	int people=num;
    vector<long long>wj(num,10000000);
    vector<vector<int>>Fruit(num,vector<int>(4,0));
    vector<vector<int>>Animal(num,vector<int>(3,0));
    num=0;
    int pk=0;
	//cout<<turn;
    while(turn--)//一共多少轮
    {
        string str;
        cin>>str;
		//cout<<str<<endl;
        if(str=="Ring")//如果按铃
        {
			//cout<<1<<endl;
            int anlin=0;
            cin>>anlin;
            num=anlin;
            if(panduan(Fruit,Animal))
            {
				//cout<<1<<endl;
                wj[num]+=pk;
                pk=0;
                for(int i=0;i<Fruit.size();++i)
                    fill(Fruit[i].begin(),Fruit[i].end(),0);
                for(int i=0;i<Animal.size();++i)
                    fill(Animal[i].begin(),Animal[i].end(),0);
            }
            else
            {
				//cout<<2<<endl;
                wj[num]=wj[num]-wj.size();
                for(int i=0;i<wj.size();++i)
                    wj[i]++;
            }
			
			
        }
        else if(str=="Animal")//如果是动物牌
        {
			//cout<<2<<endl;
            int temp=0;
            cin>>temp;
			fill(Animal[num].begin(),Animal[num].end(),0);
			fill(Fruit[num].begin(),Fruit[num].end(),0);
            Animal[num][temp]++;
            wj[num]--;
			pk++;
            num++;
			num=num%people;
			
			
        }
        else if(str=="Fruit")//如果是水果牌
        {
			//cout<<3<<endl;
			fill(Animal[num].begin(),Animal[num].end(),0);
			fill(Fruit[num].begin(),Fruit[num].end(),0);
            int temp=0;
            cin>>temp;
            while(temp--)
            {
                int n=0;
                cin>>n;
                Fruit[num][n]++;
            }
            wj[num]--;
			pk++;
            num++;
			num=num%people;
			
            
        }
        
    }
    for(int i=0;i<wj.size();++i)//输出结果
        cout<<wj[i]<<endl;
	//system("pause");
        return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值