2 条题解

  • 2
    @ 2023-12-8 23:18:06
    #include <bits/stdc++.h>
    using namespace std;
    int a, b;
    int map1[5][5]={0,-1,1,1,-1,
                   1,0,-1,1,-1,
                   -1,1,0,-1,1,
                   -1,-1,1,0,1,
                   1,1,-1,-1,0};//按照规则把胜负表写到2维数组*1win 0draw -1lose*
    queue<int> qa;
    queue<int> qb;
    int as = 0, bs = 0;
    int wl(int a, int b) {
        return map1[a][b];//返回胜负
    }
    int main() {
        int n, la, lb;
        cin >> n >> la >> lb;
        for (int i = 0; i < la; i++) {
            cin >> a;
            qa.push(a);
        }
        for (int i = 0; i < lb; i++) {
            cin >> b;
            qb.push(b);
        }
        for (int i = 0; i < n; i++) {
            int wlr = wl(qa.front(), qb.front());
            if (wlr==1) {//win ascore++
                as++;
            } else if(wlr==-1){//lose bscore++
                bs++;
            }
            qa.push(qa.front());//运用队列补齐周期长度
            qa.pop();
            qb.push(qb.front());
            qb.pop();
        }
        cout << as << " " << bs;
        return 0;
    }
    

    然后你就可以 启动原神 轻松通过了! *是不是很简单🎉️🎉️🎉️ *

    • 1
      @ 2022-12-25 17:19:56

      原文链接:[NOIP2014 提高组] 生活大爆炸版石头剪刀布_静渊隐者的博客-CSDN博客

      ​ 思路

      不是很难,直接模拟即可。

      需要注意的是,有些新手会用几万个if和else来判断。其实不必,我们用一个数组就行。比如f[1][0]=1表示当我出石头,你出剪刀时,我可以得到一分。这相对于成堆的if和else更加简洁。~(其实也一样麻烦,还容易写错)~

      (0代表剪刀,1代表石头,2代表布,3代表蜥蜴人,4代表斯波克)

      模拟的过程中,可以用mod来辅助。

      输入

      scanf("%d%d%d",&n,&t1,&t2);
      	for(int i=1;i<=t1;i++)
      	{
      		scanf("%d",&a[i]); 
      	}
      	a[0]=a[t1];
      	for(int i=1;i<=t2;i++)
      	{
      		scanf("%d",&b[i]);
      	}
      	b[0]=b[t2];
      

      不难。但要注意,要将a[0]或b[0]赋值为a[t1]或b[t2]。因为取余时,当i是t1或t2时,会在取余操作中变为零。

      操作

      for(int i=1;i<=n;i++)
      	{
      		sa+=jf[a[i%t1]][b[i%t2]];
      		sb+=jf[b[i%t2]][a[i%t1]];
      	}
      

      很简单,这里就不解释了。

      输出

      printf("%d %d",sa,sb);
      

      好,现在上代码。。。

      AC代码

      #include<bits/stdc++.h>
      using namespace std;
      int jf[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}};
      int n,t1,t2,sa,sb,a[205],b[205];
      int main()
      {
      	scanf("%d%d%d",&n,&t1,&t2);
      	for(int i=1;i<=t1;i++)
      	{
      		scanf("%d",&a[i]); 
      	}
      	a[0]=a[t1];
      	for(int i=1;i<=t2;i++)
      	{
      		scanf("%d",&b[i]);
      	}
      	b[0]=b[t2];
      	for(int i=1;i<=n;i++)
      	{
      		sa+=jf[a[i%t1]][b[i%t2]];
      		sb+=jf[b[i%t2]][a[i%t1]];
      	}
      	printf("%d %d",sa,sb);
      }
      

      总结

      这题不难,但需要四个心——耐心、细心……文末的点赞与收藏之心。

      好了,下一篇文章,将讲解Mivik 的标题

      • 1

      [NOIP2014 提高组] 生活大爆炸版石头剪刀布

      信息

      ID
      329
      时间
      1000ms
      内存
      125MiB
      难度
      2
      标签
      递交数
      59
      已通过
      48
      上传者