一、蛋糕分享 1.题目描述蘑菇培优C++期末考试个人解法......
2.题目解析现在有一个长方形的蛋糕,长 x 米,宽 y 米,想要平均分给小朋友吃,为了公平,分享的每块蛋糕必须是正方形,请问这样的正方形蛋糕边长最大是多少?
3.AC代码这道题靠最大公约数的求法,只用递归即可还原(辗转相除)。
#include//调用输入输出流头文件 using namespace std;//使用标准名字空间 long long gcd(long long x,long long y){//最大公约数 if(x%y==0) return y;//递归边界 return gcd(y,x%y);//递归 } int main(){//主函数开始 long long a,b;//长整数a,b cin>>a>>b;//输入a,b的值 cout< 二、数列 1.题目描述 2.题目解析联欢会上,主持人先在黑板上写了四个数字,分别是:2,0,1,9,然后说:“这 串数字从第五个数起,每一个数都是它前四数字之和的个位数字”。请你打印输 出这个数列的前 N 项,并计算前 N 项的和。
输入格式 单个整数:表示项数 N
输出格式 第一行:N 个数字,表示所求数列的前 N 项。
第二行:单个数字,表示前 N 项数字的和。
注意:行末不能有多余空格!!!
3.AC代码这道题运用递推(其实题目的用意已经引到了递推的结构里),依次循环,数组进行计算即可。
详细讲一下:运用数组x[ ] ,先将前四项初始化为2.0.1.9,再进行循环:x[i]=(x[i-1]+x[i-2]+x[i-3]+x[i-4])%10;
#include//调用输入输出流头文件 using namespace std;//使用标准名字空间 int x[100009];//存放数字 int N,sum;//数量,总和 int main(){//主函数开始 cin>>N;//输入N的值 x[0]=2;//第一项 x[1]=0;//第二项 x[2]=1;//第三项 x[3]=9;//第四项 for(int i=4;i 三、单词替换 1.题目描述 2.题目解析输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干 个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要 将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入格式:
输入包括 3 行,第 1 行是包含多个单词的字符串 s;第 2 行是待替换的单词 a(长度 <= 10 0); 第 3 行是 a 将被替换的单词 b(长度 <= 100). s, a, b 最前面和最后面都没有空格。
输出格式:
输出只有 1 行,将 s 中第一次出现的单词 a 替换成 b,若没有找到 a 就输出原字符串。
输入样例#1:
ha ha ha
ha
wa
输出样例#1:
wa ha ha
3.AC代码这道题考了一个重点:find函数。许多信奥学者都在传统书籍上没有见过,但需要一提的是,他在字符串的题目来说比较好用。
我们需要注意空格的处理问题。比如处理不当会把开头和结尾的单词误舍去,因此需要在各方两头添加空格。
在输出时记住覆盖部分的位置,进行continue即可。
#include//调用输入输出流头文件 #include //调用字符串头文件 using namespace std;//使用标准名字空间 int fd(string a,string b){//在a中查找单词b a=" "+a+" ";//补空格 b=" "+b+" ";//补空格 int p=a.find(b);//进行查找 return p;//返回查找值 } int main(){//主函数开始 string a,b,c;//句子,寻找,替换 getline(cin,a);//整行输入 getline(cin,b);//整行输入 getline(cin,c);//整行输入 int p=fd(a,b);//在a中查找单词b int s=p+b.size()-1;//结束值 if(p==-1){//如果没有相关单词 cout 四、扫雷游戏 1.题目描述2.题目解析扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地 雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非 地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏 的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出 n 行 m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 1≤n≤100, 1≤m≤100。
3.AC代码这是经典的图形点阵题,普遍都非常简单。这里在输入之后,进行二重循环i,j,如果当前为未知数字位,就进行周围*判断。
#include//调用输入输出流头文件 using namespace std;//使用标准名字空间 char x[109][109];//字符镇 int n,m;//行,列 bool boom(char a){//判断是否地雷 return a=='*'; } int boom(char a,char b,char c,char d,char e,char f,char g,char h){//函数重载,判断周围有几个地雷 return boom(a)+boom(b)+boom(c)+boom(d)+boom(e)+boom(f)+boom(g)+boom(h); } int main(){//主函数开始 cin>>n>>m;//输入行,列 for(int i=1;i<=n;i++)//输入内容 for(int j=1;j<=m;j++) cin>>x[i][j]; for(int i=1;i<=n;i++)//判断 for(int j=1;j<=m;j++){ if(x[i][j]=='*')//是地雷 continue;//忽略 x[i][j]=boom(x[i-1][j-1],x[i-1][j],x[i-1][j+1],x[i][j-1],x[i][j+1],x[i+1][j-1],x[i+1][j],x[i+1][j+1])+'0';//地雷统计 } for(int i=1;i<=n;i++){//输出内容 for(int j=1;j<=m;j++) cout< 五、出栈顺序 1.题目描述 2.题目解析对于一个栈,已知入栈顺序为 1,2,3,4,…,n,若希望出栈顺序为 a1,a2,a3,…,an,请 判断可能吗?输出 Yes 或 No
3.AC代码方法一(适合口算,会超时):
这种方法在口算中比较快。就是在每一项后判断比他小的数组成的数列是否降序排列。但是会超时,在编程不推荐,因为会TE3个数据。
方法二(适合编程,会通过):
循环判断入栈模拟数组的top是否和出栈次序一致(到栈底结束) 。
#include六、奖学金 1.题目描述using namespace std; const int N=100009; int stk[N],top=0,a[N]; //stk为入栈模拟数组,a为出栈次序数组 int main(){ int n; cin>>n; for(int i=1;i<=n;i++) //输入出栈次序 cin>>a[i]; int inx=1; for(int i=1;i<=n;i++) { stk[++top]=i; //按顺序push while(top!=0&&stk[top]==a[inx]){ //循环判断入栈模拟数组的top是否和出栈次序一致(到栈底结束) top--; //如果一致则做一次pop inx++; //然后准备判断现在的栈顶是否和下一个出栈次序一致 } } if(top==0) cout<<"Yes"; else cout<<"No"; return 0; } 2.题目解析某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学生 发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从 高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同 学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生 的排序是唯一确定的。 任务:先根据输入的 3 门课的成绩计算总分,然后按上 述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如, 在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是 7 号、5 号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩 之和) ,但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是: 5 279 7 279 则按输出错误处理,不能得分。
3.AC代码这里定义结构体student,代表一个学生的成绩,再用自定义比较函数cmp与快排sort结合,进行最后的排名统计。
#include#include #include using namespace std; const int N=309; struct student{ int zh,sx,en,sum,id; }; student f[N]; bool cmp(const student&a,const student&b){ if(a.sum>b.sum)return 1; if(a.sum b.zh)return 1; if(a.zh b.id)return 0; return 0; } int main(){ int n; cin>>n; for(int i=0;i >f[i].zh>>f[i].sx>>f[i].en; f[i].id=i+1; f[i].sum=f[i].zh+f[i].sx+f[i].en; } sort(f,f+n,cmp); for(int i=0;i<5;i++) cout< 总结 本期就到这里了,谢谢观看。



