1 条题解

  • 0
    @ 2025-8-24 21:20:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar DengDuck
    澳門現役 OIer,萌萌未花日奈雙推人一枚

    搬运于2025-08-24 21:20:15,当前版本为作者最后更新于2025-02-18 12:04:32,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    本题是一道基本语法题。

    在本篇题解中,我们将使用 string 类进行读入,并利用较新的遍历语法来完成编程。

    首先读入字符串,我们一个一个读入字符,并添加到字符串的末尾,一直到读到 E 字符为止。

    while(cin>>C)
    {
      if(C=='E')break;
      S+=C;
    }
    

    其中 while(cin>>C) 这一语法利用了 cin 的特性,当 cin 没能读入到信息的时候,会返回 00,那么循环就会终止。

    在本地调试的时候,你可以输入 Ctrl+Z 来使得循环终止。

    读入之后,我们可以利用遍历语法寻找所有的字符,并统计分数,我们可以把结算的条件记作:

    • max(A,B)>Lim\max(A,B)>Limmax\max 表示的是两者中较大的一个数字的数值,其中 LimLim 表示的是规则是多少分制。
    • AB2|A-B|\geq 2,其中 x|x| 是求 xx 的绝对值,相当于 C++ 中的 abs(x),意思可以理解为,去除数字的正负号。

    一局游戏能结算,当且仅当两个条件都成立。

    那我们可以得到以下代码。

    #include<bits/stdc++.h>
    using namespace std;
    char C;
    string S;
    int n,A,B;
    int main()
    {
    	while(cin>>C)
    	{
    		if(C=='E')break;
    		S+=C;
    	}
    	for(char i:S)
    	{
    		if(i=='W')A++;
    		if(i=='L')B++;
    		if(max(A,B)>=11&&abs(A-B)>=2)
    		{
    			cout<<A<<":"<<B<<endl;
    			A=0,B=0;
    		}
    	}
    	printf("%d:%d\n",A,B);
    	A=B=0;
    	puts("");
    	for(char i:S)
    	{
    		if(i=='W')A++;
    		if(i=='L')B++;
    		if(max(A,B)>=21&&abs(A-B)>=2)
    		{
    			cout<<A<<":"<<B<<endl;
    			A=0,B=0;
    		}
    	}
    	printf("%d:%d\n",A,B);
    	return 0;
    }
    

    我们发现两次统计做的事情是类似的,关键在于参数 LimLim 的不同,如果你会函数语法,我们也可以写一个函数 Work,并且含有参数 Lim,这样代码就更加简短啦!

    #include<bits/stdc++.h>
    using namespace std;
    char C;
    string S;
    int n,A,B;
    void Work(int Lim)
    {
    	for(char i:S)
    	{
    		if(i=='W')A++;
    		if(i=='L')B++;
    		if(max(A,B)>=Lim&&abs(A-B)>=2)
    		{
    			cout<<A<<":"<<B<<endl;
    			A=0,B=0;
    		}
    	}
    	printf("%d:%d\n\n",A,B);
    	A=B=0;	
    }
    int main()
    {
    	while(cin>>C)
    	{
    		if(C=='E')break;
    		S+=C;
    	}
    	Work(11),Work(21);
    	return 0;
    }
    

    我们通常用时间复杂度来判断代码的运行效率,那么这份代码的时间复杂度是 O(n)\mathcal O(n)

    • 1

    信息

    ID
    44
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者