4 条题解

  • 6
    @ 2022-12-27 10:39:22

    思路

    首先一定要开数组存胜负

    因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。

    玩过乒乓球大部分人都知道,正规乒乓球比赛,不仅分数要大于11(或21),两者分数相差也要大于2。

    如果比赛分数达到11-10,比赛会继续。直到一个人比另外一个人多两分。

    21分制同理

    我是把输入、11分制、21分制一起记录,毕竟一个函数。只开了一个数组。初始值为0(开全局变量),当录到W赋值1(胜),录到L赋值2(负)。方便下面取用。

    取用时,读到1,胜数++,读到二,负数++,按照上文判定来输出,读到0,表明记录结束了,输出之前剩余的分数即可。

    简洁版:

    • 要么一次性读取数据后面再慢慢判断
    • 要么边输入边判断两种情况,不过答案要先存起来

    AC代码

    #include<bits/stdc++.h> 
    using namespace std;
    char str[1000001], a;
    int cnt=0;
    void ccl(int n)
    {
        int a=0,b=0;
        for(int i=1;i<=cnt;i++)
        {
            if(str[i]=='W')
            {
                a++;
            }
            if(str[i]=='L')
            {
                b++;
            }
            if((a>=n||b>=n)&&abs(a-b)>=2)
            {
                cout<<a<<":"<<b<<endl;
                a=b=0;
            }
        }
        cout<<a<<":"<<b<<endl;
        return;
    }
    int main()
    {
        while(cin>>a&&a!='E')
        {
            if(a=='W'||a=='L')
            {
                cnt++; 
                str[cnt]=a;
            }
        }
        ccl(11);
        cout<<endl;
        ccl(21);
        return 0;
    }
    
    • 1
      @ 2022-10-5 8:55:14

      题解

      这道题也是模拟,我们可以在输入时模拟进球比分,在比分满足条件(这里吐槽一下,题目里也没说清楚,是在一方11\ge 11分且分差2\ge 2分才下一局)时因为输出格式的要求,加入vector。 最后遍历vector输出就可以了:

      #include <bits/stdc++.h>
      using namespace std;
      int W1, L1, W2, L2;
      char ch;
      vector<int> c1, c2, c3, c4;
      int main()
      {
          do // 我这里用了do-while
          {
              ch = getchar(); // scanf("%c", &ch);
              if (ch == 'W')
              { 
                  // 11分和21分都++
                  W1++;
                  W2++;
              }
              if (ch == 'L')
              {
                  L1++;
                  L2++;
              }
              if ((W1 >= 11 || L1 >= 11) && abs(W1 - L1) >= 2)
              {
                  c1.push_back(W1);
                  c2.push_back(L1);
                  W1 = 0; // 记得归0
                  L1 = 0;
              }
              if ((W2 >= 21 || L2 >= 21) && abs(W2 - L2) >= 2)
              {
                  c3.push_back(W2);
                  c4.push_back(L2);
                  W2 = 0;
                  L2 = 0;
              }
          } while (ch != 'E'); // 注意分号
          // 按格式输出
          for (int i = 0; i < c1.size(); i++)
          {
              printf("%d:%d\n", c1[i], c2[i]);
          }
          printf("\n");
          for (int i = 0; i < c3.size(); i++)
          {
              printf("%d:%d\n", c3[i], c4[i]);
          }
          return 0;
      }
      

      然后…………

      恭喜您获得0分的好成绩! 我们观察一下,会发现只有在循环中完成一局才会push_back,但是如果结束了而不满一局,则不会加到vector中。我们补上:

      #include <bits/stdc++.h>
      using namespace std;
      int W1, L1, W2, L2;
      char ch;
      vector<int> c1, c2, c3, c4;
      int main()
      {
          do
          {
              ch = getchar(); // scanf("%c", &ch);
              if (ch == 'W')
              {
                  W1++;
                  W2++;
              }
              if (ch == 'L')
              {
                  L1++;
                  L2++;
              }
              if ((W1 >= 11 || L1 >= 11) && abs(W1 - L1) >= 2)
              {
                  c1.push_back(W1);
                  c2.push_back(L1);
                  W1 = 0;
                  L1 = 0;
              }
              if ((W2 >= 21 || L2 >= 21) && abs(W2 - L2) >= 2)
              {
                  c3.push_back(W2);
                  c4.push_back(L2);
                  W2 = 0;
                  L2 = 0;
              }
          } while (ch != 'E'); // ;
          // 增加尾分
          c1.push_back(W1);
          c2.push_back(L1);
          c3.push_back(W2);
          c4.push_back(L2);
          for (int i = 0; i < c1.size(); i++)
          {
              printf("%d:%d\n", c1[i], c2[i]);
          }
          printf("\n");
          for (int i = 0; i < c3.size(); i++)
          {
              printf("%d:%d\n", c3[i], c4[i]);
          }
          return 0;
      }
      

      0分和100分的差距~

      ACAC CodeCode

      #include <bits/stdc++.h>
      using namespace std;
      int W1, L1, W2, L2;
      char ch;
      vector<int> c1, c2, c3, c4;
      int main()
      {
          do
          {
              ch = getchar(); // scanf("%c", &ch);
              if (ch == 'W')
              {
                  W1++;
                  W2++;
              }
              if (ch == 'L')
              {
                  L1++;
                  L2++;
              }
              if ((W1 >= 11 || L1 >= 11) && abs(W1 - L1) >= 2)
              {
                  c1.push_back(W1);
                  c2.push_back(L1);
                  W1 = 0;
                  L1 = 0;
              }
              if ((W2 >= 21 || L2 >= 21) && abs(W2 - L2) >= 2)
              {
                  c3.push_back(W2);
                  c4.push_back(L2);
                  W2 = 0;
                  L2 = 0;
              }
          } while (ch != 'E');
          c1.push_back(W1);
          c2.push_back(L1);
          c3.push_back(W2);
          c4.push_back(L2);
          for (int i = 0; i < c1.size(); i++)
          {
              printf("%d:%d\n", c1[i], c2[i]);
          }
          printf("\n");
          for (int i = 0; i < c3.size(); i++)
          {
              printf("%d:%d\n", c3[i], c4[i]);
          }
          return 0;
      }
      
      • 1
        @ 2022-9-4 15:32:39

        下面发一个我做的代码吧。个人感觉思路很明确。看一遍基本上就懂了(吧?)

        首先一定要开数组存胜负

        因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。

        其次分数差要大于2。

        玩过乒乓球大部分人都知道,正规乒乓球比赛,不仅分数要大于11(或21),两者分数相差也要大于2。如果比赛分数达到11-10,比赛会继续。直到一个人比另外一个人多两分。(如13-11)

        21分制同理

        搞完这些重点说思路

        我的思路没有DALAO们这么~复杂~优秀。我是把输入、11分制、21分制分而治之。只开了一个数组。初始值为0(开全局变量),当录到W赋值1(胜),录到L赋值2(负)。方便下面取用。

        取用时,读到1,胜数++,读到二,负数++,按照上文判定来输出,读到0,表明记录结束了,输出之前剩余的分数即可。

        下面是本蒟蒻的代码

        `

        //stone_juice石汁 P1042 乒乓球
        #include <iostream>
        #include <cstring>
        using namespace std;
        int win[62503]; 
        int w,l;
        int main()
        {
        	char s;
        	for(int i=1;cin>>s&&s!='E';i++)//循环读入,当读到字符E结束 
        	{
        		if(s=='W')win[i]=1; 
        		else win[i]=2; 
        	}
        	//----------------11分制 ----------------
        	for(int i=1;1;i++)
        	{
        		if(win[i]==1)w++;//胜场+1 
        		if(win[i]==2)l++;//负场+1 
        		if(win[i]==0)//读到0则记录结束,输出记录结束前的分数。 
        		{
        			cout<<w<<":"<<l<<endl<<endl;
        			break;
        		}
        		if(w-l>=2||l-w>=2)
        			if(w>=11||l>=11)//当双方比分相差大于2且一方分数大等于11输出 
        			{
        				cout<<w<<":"<<l<<endl;
        				w=0;//比分清零 
        				l=0;
        			}
        	}
        	w=0;//清零,为21分制计算做准备 
        	l=0;
        	//----------------21分制 ----------------
        	for(int i=1;1;i++)//一切同上,唯一区别就是判定从11变为21 
        	{
        		if(win[i]==1)w++;
        		if(win[i]==2)l++;
        		if(win[i]==0)
        		{
        			cout<<w<<":"<<l;
        			break;
        		}
        		if(w-l>=2||l-w>=2)
        			if(w>=21||l>=21)//11变为21 
        			{
        				cout<<w<<":"<<l<<endl;
        				w=0;
        				l=0;
        			}
        	}
        	return 0;//华丽地结束  ㄟ(▔▽▔)ㄏ
        }
        
      • 0
        @ 2022-9-25 15:12:50

        本题很简单,只需简单模拟一下即可

        虽然本蒟蒻的代码有亿些复杂

        这题只需注意一点:

        直到分差大于或者等于 2,才一局结束。

        所以本蒟蒻代码如下

        #include <bits/stdc++.h>
        using namespace std;
        string str;
        char ch , tmp;
        int W , L , i;
        //W:华华分数 L:华华对手分数
        int main(){
            ch = tmp;//清空ch
            while(ch != 'E'){//11分制
                ch = getchar();//读入ch
                if(ch == 'W')//若为'W',W++
                    W++;
                if(ch == 'L')//若为'L',L++
                    L++;
                str += ch;
                //将输入的ch存入str中,方便记录21分制
                if((W >= 11 || L >= 11) && abs(W - L) >= 2){
                //若华华或华华对手高于11分并且分差大于2分,结束本局比赛
                    cout << W << ':' << L << '\n';
                    W = 0 , L = 0;
                    //输出比分并将比分清零
                }
            }
            cout << W << ':' << L << '\n';
            W = 0 , L = 0;
            //输出最后比分
            cout << '\n';//换行
        
            //21分制与11分制类似
            ch = tmp;//清空ch
            while(ch != 'E'){
                ch = str[i++];
                if(ch == 'W')
                    W++;
                if(ch == 'L')
                    L++;
                if((W >= 21 || L >= 21) && abs(W - L) >= 2){
                    cout << W << ':' << L << '\n';
                    W = 0 , L = 0;
                }
            }
            cout << W << ':' << L;
            return 0;
        }
        
        • 1

        [普及][NOIP2003 普及组] 乒乓球

        信息

        ID
        1724
        时间
        1000ms
        内存
        256MiB
        难度
        5
        标签
        递交数
        228
        已通过
        83
        上传者