- gf25030 的博客
2026羊城青少年人工智能创新实践挑战赛-C++初中组-决赛模拟题
- @ 2026-9-12 14:43:00
前言
如果是OI的话应该只能拿372分,本文纯手搓耗时50min,stecmp部分询问了DeepSeek V4.1 Flash

A.客观题
1.while循环与do-while循环的执行次数总是相同的(x)
相同代码次数总是差一
2.strcmp返回0表示两个字符串相等(√)
蒙对了。
stecmp处理两个字符串,设S1/S2,如果S1的字典序大于S2,会返回小于0的数,反之则是大于0,如果相等返回0鸭蛋
3.strlen("abcd")的值是5(x)
strlen返回字符长度,啥比赛带字符串的都常考,和size一样不考虑换行符(\n)
4.string的find找不到子串时返回0(x)
返回的是string::npos
5.函数的值传递参数,在函数内部修改不会影响实参(√)
影响的是函数里的参数,俗称“形参”,确实不会影响实参,故正确
6.string类型可以直接用+拼接字符串(√)
没毛病
#include<bits/stdc++.h>
using namespace std;
string s1="LLLLL",s2="114514";
int main(){
cout<<s1+s2;//LLLLL114514;
return 0;
}
7.二分查找的时间复杂度是O(log n)(√)
没问题,但是我以为是O(nlogn)第一次就错了这道
8.冒泡排序和选择排序都是稳定排序(x)
选择排序不稳定
dxd小技巧:选择排序是老师来替学生选,学生肯定不高兴
9.两个同类型的结构体变量可以直接用==判断是否相等(x)
会直接报错
10.自定义函数可以写在主函数后面(√)
做这题时坚信了自己的想法对了。。 虽然放这用不了,调用会报错,但是题目只是说在main函数后面塞了一个东西,没有说要用,不用其实不会报错
B.改造花园
非常简单的嵌套循环题目,luogu难度估计是 入门 (太简单了吧)

AC code
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==1||j==1||i==j||i==n||j==n||i==n-j+1)cout<<'*';
else cout<<'#';
}cout<<'\n';
}
return 0;
}
C.找数
二分查找,手打很简单,函数写法相当于找>z的数在让pos-1。
本来用的是函数写法,由于本人二分没学好不怎么懂检查pos条件语句写成了if(pos==1||pos==n)cout<<-1;喜提82,把后面删了就AC了
手打二分AC code
#include<bits/stdc++.h>
using namespace std;
int n,a[105],k;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>k;
int l=1,r=n;
while(l<r){
int mid=l+(r-l+1)/2;
if(a[mid]<=k)l=mid;
else r=mid-1;
}
if(a[l]>k)cout<<-1;
else cout<<l;
return 0;
}
暴力枚举AC code
#include<bits/stdc++.h>
using namespace std;
int n,a[105],k;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>k;
for(int i=n;i>=1;i--){
if(a[i]<=k){
cout<<i;
return 0;
}
}
cout<<-1;
return 0;
}
函数AC code
#include<bits/stdc++.h>
using namespace std;
int n,a[105],k;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>k;
int pos=upper_bound(a+1,a+1+n,k)-a;
if(pos==1)cout<<-1;
else cout<<pos-1;
return 0;
}
D.数字金字塔

不难看出 这便是最优解
递推,然后在最下面的一行找最大值
AC code
#include<bits/stdc++.h>
using namespace std;
int n,dp[1005][1005],a[1005][1005],ans=-114514;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
dp[1][1]=a[1][1];
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
}
}
for(int i=1;i<=n;i++){
ans=max(ans,dp[n][i]);
}
cout<<ans;
return 0;
}