一,单项选择
4,以下程序执行完毕后,i和s的值分别是( )。
int i,s=0;
for(int i=1;i<=5;i=i+2){
s=s+i;
}
A, 5和9; B,7和9; C, 5和7; D, 9和7。
我的答案:A。
正确答案:B。
解析:i=5后还要再加一个2才结束。
7,用冒泡排序的方法对一个长度为n的数据进行排序,平均时间复杂度为( )。
A,O(n*n);B,O(n log2 n);C,O(n);D,O(nn)
正确答案:A。
解析:
一丶常数阶O(1) eg:
int a=1;
int b=2;
int c=3;
各执行一次,时间复杂度为 O(1);
for (int i = 0; i < 100; i++) {
printf("hello"); //执行一百次,也是常量级,记为O(1)
}
大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。
上面的算法并没有随着某个变量的增长而增长,所以无论多长,时间复杂度都为O(1).
二丶线性阶O(n) eg :
for(int i=0;i<n;i++)
{
}
上面的循环要执行N次,所以时间复杂度为O(n)。
对数阶O(logN)
int a= 1;
while(a < n)
{
a = a * 2;
}
执行x次之后 x=log2(n),把2换成其他数也是一样(换底公式:loga(b)*logc(a)=logc(b))
所以时间复杂度为O(logN)
三丶线性对数阶O(nlogN)
for(int i=0;i<n;i++)
{
while(a<n)
{
i=i*2;
}
}
for循环嵌套while循环 即时间复杂度为 O(n)*O(logN) O(nlogN)
四丶平方阶O(n²)
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; i++); //执行n次
{
}
}
两个for循环嵌套
此时的时间复杂度为O(n*n).
二,代码解析
32,
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int a[maxn][maxn],b[maxn][maxn];
int f(int m,int n) {
if(m<=0||n<=0) {
return 0;
}
a[0][0]=b[0][0];
for(int i=1; i<n; i++) a[0][i]=a[0][i-1]+b[0][1];
for(int i=1; i<m; i++) a[i][0]=a[i-1][0]+b[i][0];
for(int i=1; i<m; i++) {
for(int j=1; j<n; j++) {
a[i][j]=min(a[i-1][j],a[i][j-1]+b[i][j]);
}
}
return a[m-1][n-1];
}
int main() {
int m,n;
cin>>m>>n;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
cin>>b[i][j];
}
}
cout<<f(m,n);
return 0;
}
我们将上述代码称为( )。
A, 深度搜索; B,广度搜索; C,动态规划; D,贪心。
正确答案:C。
解析:代码的第10~18排就是在做dp。
39~43题:答案:ADBAC
39,解析:因为从cnt[i]不为0,所以当cnt[i]=0时应 !cnt[i],所以选A。
40,解析:删除点u,将入度v-1。所以选D。
41,解析:入度为0时入队,所以选B。
42,解析:如果有环,那么环上的点永远无法入度为0,所以入队点数 !=n,所以选A。
43,解析:单向边,将y的入度加1,所以选C。