一、单项选择
1、以下与电子邮件无关的网络协议是
A、SMTP B、POP3 C、MIME D、FTP
答案:D,FTP是文件传输协议
错因:不知道
2、布尔型变量占用( )个比特位
A、1 B、2 C、4 D、8
答案:D,1布尔变量=1字节=8bit
错因:2*4=4他真的我哭死
3、由4个节点构成的形态不同的二叉树有( )种
A、16 B、14 C、20 D、10
答案:B
解析:令f[i]表示i个节点的二叉树个数,在f[0]=1,f[i]=f[4]=14
4、一颗6节点二叉树的中序遍历为ABDGECF,先序遍历为DBACEF后序遍历为( )
A、DGBEFAC B、ABGEFCD C、GBEACFD D、ABCDEFG
答案:B
解析:由先序排序可得D为根,所以后序必须是D为最后一个,排除A、D
由中序的G在右子树中,所以后序不可能以G为开头,排除C
先序:DLR(根左右)中序:LDR(左根右)后序:LRD(左右根)
错因:自己的问题,把先、中、后序的顺序记反了
小补充:时间复杂度:冒泡排序:O(n*n)
二、阅读程序
1、
#includ<iostream>
using namespace std;
int a,b,c;
int main()
{
cin>>a>>b>>c;
a=b-a;
b=b-a;
a=b+a;
c=b-a;
cout<<a<<" "<<b<<" "<<c;
return 0;
}
1、若输入123456789012 2 3,将输出2 123456789012 123456789010( )
A、正确 B、错误
答案:B
解析:123456789012超出了int的范围
错因:无脑狂爱int,不熟悉int的范围
2、将头文件<iostream>可以改成<cstdio>( )
A、正确 B、错误
答案:B
解析:cstdio不能cin,cout
错因:无脑狂爱万能头,其他一窍不通
2、
#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;
}
分析:本代码是用DP求(0,0)——>(m-,n-1)的最短路
1、输入数据为:
4 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
则输出的结果为:
A、28 B、16 C、136 D、46
答案:D
解析:经过的数字为1、2、3、4、8、12、16
错因:计算错误、对DP不是很熟
2、我们将上述算法成为( )
A、DFS B、BFS C、DP D、贪心
答案:C
解析:DP是以左下或右下探索,BFS是从一点向四周,DFS是直接搜,贪心及更不可能了
错因:对于DP不是很熟
三、完善程序
1、
#include<bits/stdc++.h>
using namespace std;
#define N 1001
int n,m,x,y;
vector<int>G[N];//vector:流动线行数组,不可查位置,可以省掉大部分空间
stack<int>q;//栈,先头后尾
int cnt[N],tpc;
bool pd()
{
for(int i=1;i<=N;i++) if(______) q.push(i);
while(!q.empty())
{
int u=q.top();
q.pop();
pc++;
for(int i-0;i<G[u].size();i++)
{
int v=G[u][i];o
________
if(!cnt[v])_______;
}
}
if(__________) return 1;
else return 0;
}
int main()
{
cin>>n>>m;
while(m--)
{
cin>>x>>y;
G[x].push_back(y);
______________;
}
if(pd()) cout<<"存在有向环";
else cout<<"不存在有向环";
return 0;
}
分析:(拓扑排序)输入一张n节点m条边的有向图,用该图的一个拓扑排序的方式判断该图是否存在有向环,若有拓扑排序输出排序,没有输出没有,否则则输出有
1、2处应该填( )
A、q.push(v); B、q.pop(); C、cnt[u]--; D、cnt[v]--;
答案:D
解析:删除点u,将v的入读为-1
2、3处应该填( )
A、q.pop() B、q.push(v); C、tpc--; D、tpc++
答案:B
解析:v的入度变为零时入队
3、5处应该填( )
A、cnt[x]++; B、G[y].push(x); C、cnt[y]++; D、G[y].push_back(x);
答案:C
解析:单向边,将y的入度为1