教育场了属于是,深感自己变菜了
按照字典序排序输入的字符串,后面加上 YYDS! 后输出
打卡题,这里就不放代码了
如果有一个60以下则输出“TCL”,如果所有课程的成绩都大于等于85,且平均分大于等于90,则输出"TQL"
可以使用printf格式化输出,其他的直接看代码吧
for(int i=1;i<=n;i++){ int m,sum=0,flag=1,a; cin>>m; for(int j=0;j<m;j++){ cin>>a;//输入成绩 if(flag==-1)continue;//若已经存在60以下科目则不继续判断 if(a<60)flag=-1;//存在60以下科目,TCL else if(a<85)flag=0;//存在85以下科目,无法成为优秀学生 else sum+=a;//计算当前总分 } if(sum<90*m&&flag==1)flag=0;//平均分小于90,无法成为优秀学生 if(flag==-1)printf("No.%d TCL\n",i); else if(flag==1)printf("No.%d TQL\n",i); }
求区间[a,b]内的平均分
这道题是经典的前缀和题目,所以首先介绍一下前缀和思想:
剩下的直接看代码吧
for (int i = 1; i <= n; i++) { int sum=0,num; for(int j=1;j<=9;j++) { scanf("%d", &num);//分数读入 if (i>1)arr[i][j] =arr[i-1][j]+num;//记录前缀和 else arr[i][j] = num; sum+=num; } arr[i][0]=sum+arr[i-1][0];//在arr[i][0]记录综合前缀和,本题因为数值不大,所以可以使用int }
一个人的姓名中第一个字和最后一个字的拼音相同,则认为该名字为回文姓名
一道字符串比对题目,本题可以简单分为三类:(1)姓氏的拼音长度大于名(2)姓氏的拼音长度等于名(3)姓氏的拼音长度小于名
int len1=s1.length(),len2=s2.length(); if(len1>len2) cout<<"No\n"; else if(len1==len2){ if(s1==s2)cout<<"Yes\n"; else cout<<"No\n"; } else{ string s3=s2.substr(len2-len1); s3[0]= toupper(s3[0]);//令第三个字的首字母大写,方便同姓氏拼音比对 s2[0]= tolower(s2[0]);//令第二个字的首字母小写,方便韵母比对 bool flag=(s1==s3); int flag2=0; for(int j=0;j<len2-len1&&flag==1;j++){ if(s2[j]=='a'||s2[j]=='e'||s2[j]=='i'||s2[j]=='o'||s2[j]=='u'||s2[j]=='v') flag2++; } if(flag&&flag2)cout<<"Yes\n";//flag大于0则说明第二个字中包含韵母,符合题意中的检查要求 else cout<<"No\n"; }
三维搜索连续的0的个数,返回最大值
使用BFS/DFS算法,主要为算法的变式,与常规的BFS题目不同的是,本题是求面积范围而不是给定起点与重点求最短路,所以本题需要自己拟定起点,我给出的代码只能说中规中矩,有很多可以优化的地方,感兴趣的可以自己进行优化。
以上为我认为可以优化的两个地方。
(1)代码一:BFS,使用队列
关于队列知识,可以查看我的博客《[C++STL] 队列 queue 的入门》
#include<bits/stdc++.h>using namespace std;struct point { int x, y, z;};int L, R, C;//记录三个方向的长度int g[11][11][11];//记录是否为空洞bool dist[11][11][11];//记录该位置是否被检索过int dx[] = {1, -1, 0, 0, 0, 0};//方向数组int dy[] = {0, 0, 1, -1, 0, 0};//方向数组int dz[] = {0, 0, 0, 0, 1, -1};//方向数组queue<point> q;//声明一个队列,队列没有学过的可以去看我的往期博客int bfs(int i, int j, int k) { q.push({i,j,k});//起点进入队列 int v = 0;//记录共有多少个连续的元素 dist[i][j][k] = true;//标记该点已经走过 while (!q.empty()) { point t = q.front();//获取队头数据 q.pop();//出队(丢弃) v++; for (int i = 0; i < 6; i++) { int di = t.x + dx[i], dj = t.y + dy[i], dk = t.z + dz[i]; if (di >= 0 && di < L && dj >= 0 && dj < R && dk >= 0 && dk < C && g[di][dj][dk]==0 && !dist[di][dj][dk]) {//这一行首先判断了是否越界,然后判断该点是否可以通过,然后判断是否已经过 dist[di][dj][dk] = true;//标记该点已经走过 q.push({di, dj, dk});//符合的点,入队 } } } return v;}int main() { int t; cin >> t; while (t--) { cin>>L>>R>>C; memset(dist, 0, sizeof dist); for (int i = 0; i < L; i++) for (int j = 0; j < R; j++) for (int k = 0; k < C; k++) cin>>g[i][j][k];//输入三维数组 int ma = 0; for (int i = 0; i < L; i++) for (int j = 0; j < R; j++) for (int k = 0; k < C; k++) if (!dist[i][j][k]&&g[i][j][k]==0)//如果当前的位置未被检索过,且为“空洞” ma = max(ma, bfs(i,j,k));//将改点作为起点进行bfs搜索 cout << ma << endl; } return 0;}
(2)代码二:BFS,使用递归
int bfs(int i, int j, int k) { if (i < 0 || i >= L || j < 0 || j >= R || k < 0 || k >= C)return 0;//判断越界 if (dist[i][j][k] || g[i][j][k] == 1)return 0;//已经走过或者不为“空洞” dist[i][j][k] = true;//标记已经走过 return 1 + bfs(i, j, k + 1) + bfs(i, j, k - 1),bfs(i, j + 1, k), bfs(i, j - 1, k) +bfs(i + 1, j, k), bfs(i - 1, j, k);//向六个方向试探}
岛屿和岛屿之间通过桥梁进行连接,有的岛屿之间有桥梁,有的岛屿之间没有桥梁,但可以经由通往别的岛屿的桥梁绕行到目的岛屿。如果完全无法通行,只能租用水上飞机才能到达该岛屿。以第1座岛屿为起点,想要游历一遍所有的岛屿,并且最终回到第1座岛屿,问他至少需要租用多少次水上飞机?
set<int>ans; for(int j=1;j<=m;j++) ans.insert(k[find(j)]); if(ans.size()==1)cout<<0<<endl;//由于最终需要回到起始岛屿,若全部联通则不需要 else cout<<ans.size()<<endl;
for(int j=1;j<=m;j++) k[find(j)]=1; int ans=0; for(int j=1;j<=m;j++) if(k[j])ans++; if(ans==1)ans=0; cout<<ans<<endl;
第五题使用矩阵快速幂,只能说再等等,可能等不到了(课设太多了啊喂!)
制作:BDT20040