华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1512|回复: 9
打印 上一主题 下一主题

P1328 生活大爆炸版石头剪刀布

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-5-13 11:26:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1328

题目描述
石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一 样,则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。

升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:

斯波克:《星际迷航》主角之一。

蜥蜴人:《星际迷航》中的反面角色。

这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。



现在,小 A 和小 B 尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,但周期长度不一定相等。例如:如果小A以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为 66 的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-......”,而如果小B以“剪刀-石头-布-斯波克-蜥蜴人”长度为 55 的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-......”

已知小 A 和小 B 一共进行 NN 次猜拳。每一次赢的人得 11 分,输的得 00 分;平局两人都得 00 分。现请你统计 NN 次猜拳结束之后两人的得分。

输入输出格式
输入格式:
第一行包含三个整数: N,N_A,N_BN,分别表示共进行 N 次猜拳、小 A 出拳的周期长度,小 B 出拳的周期长度。数与数之间以一个空格分隔。

第二行包含 N_A个整数,表示小 A 出拳的规律,第三行包含 N_B个整数,表示小 B 出拳的规律。其中,0 表示“剪刀”,1 表示“石头”,2 表示“布”,3 表示“蜥蜴人”,4 表示“斯波克”。数与数之间以一个空格分隔。

输出格式:
输出一行,包含两个整数,以一个空格分隔,分别表示小 A、小 B 的得分。

输入输出样例
输入样例#1:
10 5 6
0 1 2 3 4
0 3 4 2 1 0
输出样例#1:
6 2
输入样例#2:
9 5 5
0 1 2 3 4
1 0 3 2 4
输出样例#2:
4 4

回复

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
沙发
发表于 2018-5-14 06:53:57 | 只看该作者
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <string>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <iostream>
  7. using namespace std;
  8. int map[5][5]={0,0,1,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,1,0,0,0};
  9. int a[300],b[300]={0};
  10. int wyl=0,happy=0;
  11. int main()
  12. {
  13.         int n,na,nb;
  14.         scanf("%d%d%d",&n,&na,&nb);
  15.         for(int i=0;i<na;i++)
  16.                 scanf("%d",&a[i]);
  17.         for(int i=0;i<nb;i++)
  18.                 scanf("%d",&b[i]);
  19.         for(int i=0;i<n;i++)
  20.     {
  21.         wyl+=map[a[i%na]][b[i%nb]];
  22.         happy+=map[b[i%nb]][a[i%na]];   
  23.     }
  24.     printf("%d %d",wyl,happy);
  25.     return 0;
  26. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
板凳
 楼主| 发表于 2018-5-14 12:25:08 | 只看该作者
告诉你一个小技巧,别人我都不说的,你看我的二维数组
  1. const int j[5][5]={
  2. +0,-1,+1,+1,-1,
  3. +1,+0,-1,+1,-1,
  4. -1,+1,+0,-1,+1,
  5. -1,-1,+1,+0,+1,
  6. +1,+1,-1,-1,+0
  7. };
复制代码


完整地程序:
  1. #include<iostream>
  2. using namespace std;
  3. const int j[5][5]={
  4. +0,-1,+1,+1,-1,
  5. +1,+0,-1,+1,-1,
  6. -1,+1,+0,-1,+1,
  7. -1,-1,+1,+0,+1,
  8. +1,+1,-1,-1,+0
  9. };
  10. int n,na,nb,sa,sb,i;
  11. const int mm=209;
  12. int a[mm],b[mm];
  13. int ta,tb;
  14. int main()
  15. {

  16.     cin>>n>>na>>nb;  ///和题目里面的变量统一,尽可能避免理解失误
  17.     for (i=0;i<=na-1;i++) cin>>a[i];
  18.     for (i=0;i<=nb-1;i++) cin>>b[i];
  19.     sa=sb=0;
  20.     for (i=0;i<=n-1;i++)
  21.     {
  22.         ta=a[i%na]; ///不要嵌套太多,清晰至上
  23.         tb=b[i%nb];
  24.         ///cout<<ta<<':'<<tb<<endl;  检查
  25.         if (j[ta][tb]==1) sa++;
  26.           else if (j[ta][tb]==-1) sb++;
  27.     }
  28.     cout<<sa<<' '<<sb;
  29.     return 0;
  30. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
地板
发表于 2018-5-14 12:44:07 | 只看该作者
孙老师,小技巧是指把数组写成矩阵的形式吗?
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
5#
 楼主| 发表于 2018-5-14 18:11:10 来自手机 | 只看该作者
是的 而且 还加上了没有意义的正号负号保持队形
回复 支持 反对

使用道具 举报

3

主题

12

帖子

45

积分

华一学生

积分
45
6#
发表于 2018-6-5 16:52:15 | 只看该作者
不解释暴力模拟:

  1. #include<iostream>
  2. using namespace std;
  3. int k=1,j,i=1,s1,s2,n,n1,n2;
  4. int main(){
  5.     cin>>n>>n1>>n2;
  6.     int a[n1+1],b[n2+1];
  7.     for (i;i<=n1;i++) cin>>a[i];
  8.     for (i=1;i<=n2;i++) cin>>b[i];
  9.     i=0;
  10.     for (k;k<=n;k++)
  11.     {
  12.         i=i+1;j=j+1;
  13.         if (i>n1) i=1;
  14.         if (j>n2) j=1;
  15.         if (a[i]==0)
  16.         {
  17.             if (b[j]==1) s2++;
  18.             if (b[j]==2) s1++;
  19.             if (b[j]==3) s1++;
  20.             if (b[j]==4) s2++;
  21.         }
  22.         if (a[i]==1)
  23.         {
  24.             if (b[j]==2) s2++;
  25.             if (b[j]==0) s1++;
  26.             if (b[j]==3) s1++;
  27.             if (b[j]==4) s2++;
  28.         }
  29.         if (a[i]==2)
  30.         {
  31.             if (b[j]==0) s2++;
  32.             if (b[j]==1) s1++;
  33.             if (b[j]==3) s2++;
  34.             if (b[j]==4) s1++;
  35.         }
  36.         if (a[i]==3)
  37.         {
  38.             if (b[j]==0) s2++;
  39.             if (b[j]==1) s2++;
  40.             if (b[j]==2) s1++;
  41.             if (b[j]==4) s1++;
  42.         }
  43.         if (a[i]==4)
  44.         {
  45.             if (b[j]==0) s1++;
  46.             if (b[j]==1) s1++;
  47.             if (b[j]==2) s2++;
  48.             if (b[j]==3) s2++;
  49.         }
  50.     }
  51.     cout<<s1<<" "<<s2;
  52.     return 0;
  53. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
7#
 楼主| 发表于 2018-6-5 16:54:18 | 只看该作者
李思旷你这样做肯定不是专业选手,你看看我们的那个比较表!
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
8#
发表于 2018-7-11 13:59:16 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int i,j;
  4. int na,nb,n,wina,winb;
  5. int q[300],p[300];
  6. int a[5][5]=
  7. {+0,-1,+1,+1,-1,
  8. +1,+0,-1,+1,-1,
  9. -1,+1,+0,-1,+1,
  10. -1,-1,+1,+0,+1,
  11. +1,+1,-1,-1,+0};
  12. int main()
  13. {
  14.     cin>>n>>na>>nb;
  15.     for(i=0;i<na;i++)
  16.         cin>>p[i];
  17.     for(i=0;i<nb;i++)
  18.         cin>>q[i];
  19.     for(i=0;i<n;i++)
  20.     {
  21.         if(a[p[i%na]][q[i%nb]]>0)wina++;
  22.         if(a[q[i%nb]][p[i%na]]>0)winb++;
  23.     }
  24.     cout<<wina<<" "<<winb;
  25.     return 0;
  26. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
9#
 楼主| 发表于 2018-7-11 16:54:16 | 只看该作者
楼上闻同学,很好!多做题!
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
10#
发表于 2018-7-23 23:34:31 | 只看该作者
在寝室浑浑噩噩地写的,用时40分钟,裹了半天
  1. #include<iostream>
  2. using namespace std;
  3. int p[5][5]={0,0,1,1,0,
  4.              1,0,0,1,0,
  5.              0,1,0,0,1,
  6.              0,0,1,0,1,
  7.              1,1,0,0,0};
  8. int a1[300],b1[300];
  9. int n,a,b,i,j,k,c1,c2;
  10. int main()
  11. {
  12.     cin>>n>>a>>b;
  13.     for(i=0;i<=a-1;i++) cin>>a1[i];
  14.     for(i=0;i<=b-1;i++) cin>>b1[i];
  15.     for(i=0,j=0,k=1;k<=n;i++,j++,k++)
  16.     {
  17.         if(i==a) i=0;if(j==b) j=0;
  18.         c1+=p[a1[i]][b1[j]];c2+=p[b1[j]][a1[i]];
  19.     }
  20.     cout<<c1<<' '<<c2;
  21.     return 0;
  22. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 13:51 , Processed in 0.179390 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表