#题目:
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;
}