在“五一劳动节”,我们终于迎来了四月月赛(呵呵)。但这个月赛还是出得很有水平的,那笔者就带大家看一看这些题吧!
奥小白与小南老师游庐山
这道题从本质上来说比较水,但考察到了字符串的处理,还是非常考验技巧的。
解题思路
这道题说要以空格为字符的分界线,那么怎么处理就十分关键了,你可以像这样:
string a;
string s[6];
int t=1;
cin>>a;
for(int i=0;i<a.size();i++){
if(a[i]!=' ')
s[t]+=a[i];
else
t++;
}
是不是十分复杂?
Q:能不能在输入的时候就处理好呢??
A:可以的。
让我们来回顾一下各种输入字符串的方式和效果吧。
scanf
用 scanf输入以空格为分界,读到空格自动不输入了。
比如说,输入:I love coding,则scanf("%s",a) (没有&符号!) 则a数组里得到的是“I”一个字符串。是最适合本题的读入的。
gets
用gets,则得到的是一行,以“\n”为分隔符。
还是输入I love coding,则gets(a)得到的是“I love coding”。也很常用。
好的回归正题,所以用scanf就可以轻松解决本题了。
代码分析(具体看注释)
#include<bits/stdc++.h>
using namespace std;
int val(char* a)//计算a数组中的字符ASCII码平均值
{
int len=strlen(a);
int sum=0;
for(int i=0;i<len;i++)
{
sum+=a[i];//sum记录总值
}
return sum/len;
}
int main()
{
int score=0;
char a[3][6][11];//第一维是行数,第二维是这一行中的第i个字,第三维是这个字第j个字符
for(int i=1;i<=5;i++)
{
scanf("%s",a[1][i]);
}
for(int i=1;i<=5;i++)
{
scanf("%s",a[2][i]);//输入用scanf,没有“&”
}
for(int i=1;i<=5;i++)
{
int mns=abs(val(a[1][i])-val(a[2][i]));
if(mns<=10)
{
score+=(11-mns);//根据题意,计算总值
}
}
cout<<score<<endl;
return 0;
//结束了
}
奥小白与小南老师游南京
这道题是我参加比赛中最好玩的一道题,我在比赛中用二分做满分,但我的老师告诉我这道题正解应该是动归,很有意思,那我就带大家把这两种方法都梳理一遍。