前言

如果是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;
}