1 条题解
-
0
自动搬运
来自洛谷,原作者为

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没能读入到信息的时候,会返回 ,那么循环就会终止。在本地调试的时候,你可以输入
Ctrl+Z来使得循环终止。读入之后,我们可以利用遍历语法寻找所有的字符,并统计分数,我们可以把结算的条件记作:
- , 表示的是两者中较大的一个数字的数值,其中 表示的是规则是多少分制。
- ,其中 是求 的绝对值,相当于 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; }我们发现两次统计做的事情是类似的,关键在于参数 的不同,如果你会函数语法,我们也可以写一个函数
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; }我们通常用时间复杂度来判断代码的运行效率,那么这份代码的时间复杂度是 。
- 1
信息
- ID
- 44
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者