题解 P1328 【生活大爆炸版石头剪刀布】
这题我觉得枚举就行了!!
枚举算法:
枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。 [1] 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,就是一个枚举。
1.石头剪子布,又称“猜丁壳”。是一种流传多年的猜拳游戏。起源地有争议,可以肯定的是起源于亚洲,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。
2.简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时拥有“意外”与“技术”两种特性,深受世界人民喜爱。
3.比赛时间过短,观赏性较差,以及心理博弈的“高深”性,又使得这个游戏不容易被当做“普通”游戏,或者比赛来看,尽管国际上也有石头剪子布的比赛。
规则:石头打剪刀,布包石头,剪刀剪布,在这种游戏中,一锻炼了人的反应能力,二可以看出一个人的灵活性。
石头剪子布,是最平衡的游戏,发明这个游戏的人肯定是个数学家,他不仅成功的实现了五进制到三进制的转化,而且将相生相克的哲理蕴育其中。
石头剪子布具有数学上的非递移性,递移关系R的定义是(a R b 与 b R c)则a R c。一个集合同时具有反身性、反对称性与递移性时,可称作偏序关系,类似于“大”与“小”的关系。
理论上,一个集合里较“大”的元素是比较接近最优化选择。 可是,在石头剪子布这个集合里并不存在。因为剪子、石头、布都不具递移关系,如:石头赢剪子,剪子赢布、布赢石头。因为元素a,b,c都可传递到自己身上,所以这个关系可以称作非递移性。
这种“非递移性”或者“循环相克”特性,使得石头剪子布成为最平衡的游戏,规则绝对平衡,简单明了没有任何漏洞可抓,没有任何IMBAlance可供利用。
但是这不意味着石头剪子布就是一个无聊的游戏,按照概率的分析,无论石头、剪刀或者布,使用的总次数之比应该会趋近1:1:1。而事实不然,特别是当人们开始懒于思考的时候。整个游戏过程中充满了“心理博弈”,单次的输赢可能更多取决于运气,但是多次比赛的话,赢家一定是个心理博弈的高手。
话锋一转,转到本题
这题就是枚举+队列
本题游戏规则:
inline void Read()
{
scanf("%d%d%d",&n,&n1,&n2);
for(i=1;i<=n1;i++)
{
scanf("%d",&a);
q1.push(a);
}
for(i=1;i<=n2;i++)
{
scanf("%d",&b);
q2.push(b);
}
}
除了输入里面用到了队列,其他的都没难度,例如:
if(a==0)
{
if(b==0) continue;
if(b==1) sum2++;
if(b==2) sum1++;
if(b==3) sum1++;
if(b==4) sum2++;
}
最后面粘上来自charliezhi2007的代码:
#include<bits/stdc++.h>
using namespace std;
queue<int> q1;
queue<int> q2;
int n,n1,n2,a,b,i,j,l,sum1,sum2;
inline void Read()
{
scanf("%d%d%d",&n,&n1,&n2);
for(i=1;i<=n1;i++)
{
scanf("%d",&a);
q1.push(a);
}
for(i=1;i<=n2;i++)
{
scanf("%d",&b);
q2.push(b);
}
}
inline void solve()
{
for(i=1;i<=n;i++)
{
a=q1.front();
b=q2.front();
q1.pop();
q2.pop();
q1.push(a);
q2.push(b);
if(a==0)
{
if(b==0) continue;
if(b==1) sum2++;
if(b==2) sum1++;
if(b==3) sum1++;
if(b==4) sum2++;
}
if(a==1)
{
if(b==0) sum1++;
if(b==1) continue;
if(b==2) sum2++;
if(b==3) sum1++;
if(b==4) sum2++;
}
if(a==2)
{
if(b==0) sum2++;
if(b==1) sum1++;
if(b==2) continue;
if(b==3) sum2++;
if(b==4) sum1++;
}
if(a==3)
{
if(b==0) sum2++;
if(b==1) sum2++;
if(b==2) sum1++;
if(b==3) continue;
if(b==4) sum1++;
}
if(a==4)
{
if(b==0) sum1++;
if(b==1) sum1++;
if(b==2) sum2++;
if(b==3) sum2++;
if(b==4) continue;
}
}
printf("%d %d",sum1,sum2);
}
int main()
{
Read();
solve();
return 0;
}