不是VIP会员,不能显示答案,请在后台“我的信息” 在线升级 VIP

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)

1. 请选出以卜的能够被3整除的数( )。

  • A.(14)6
  • B.(29)12
  • C.(4)5
  • D.(7^4)9

2. 运行一个计算机程序,必须将程序装入( )。

  • A.CPU
  • B.硬盘
  • C.内存
  • D.U盘

3. 入栈顺序为{1,9,4,3,6}的序列的出栈序列不可能为( )。

  • A.{6,3,4,9,1}
  • B.{1,4,9,3,6}
  • C.{9,4,6,3,1}
  • D.{3,4,1,6,9}

4. 以下IP地址一定指向本机的是()。

  • A.172.0.0.1
  • B.192.168.1.1
  • C.127.0.0.1
  • D.0.0.0.0

5. 对于某算法的时间复杂度,若有:T(N)= 4T(N/2)+N^2log^2N, N=1 则该算法的时间复杂度为()。

  • A.O(N)
  • B.O(N logN
  • C.O(N logN)
  • D.O(N logN)

6. 以下排序算法不是基于比较的是( )。

  • A.堆排序
  • B.基数排序
  • C.希尔排序
  • D.插入排序

7. 一位女主人宴请5位男士和4位女士,该女主人让所有男士和女士(包含该女主人)围一张圆桌男女交替就坐的方法( )种。

  • A.2880
  • B.3600
  • C.2160
  • D.3000

8. 群是包含一种运算与一个集合的结构。群满足封闭性,即集合中的任意两个元素在该运算的作用下仍属于该集合,据此推断,集合N与以下运算不可能构成群的是( )。

  • A.加法
  • B.减法
  • C.乘法
  • D.幂

9. 一棵树高为4的线段树,全少有( )个节点。

  • A.16
  • B.15
  • C.9
  • D.8

10. 以下行为在C++98标准下不是未定义的是( )。

  • A.未声明初始值的int变量的值
  • B.将i++赋值给i
  • C.函数调用中不同参数的求职顺序
  • D.使用变量作为长度声明数组

11. 左图的先序遍历是( )。

  • A.ABDEFC
  • B.DBEFAC
  • C.DFEBCA
  • D.ABCDEF

12. 复杂度分析中常用的O(N)与Q(N)各自代表了( )。

  • A.上界、既是上界也是下界
  • B.上界、下界
  • C.下界、既是上界也是下界
  • D.下界、下界

13. 由四个不同的点构成的简单无向连通图的个数是()。

  • A.32
  • B.35
  • C.38
  • D.41

14. $4^{116}$除以113的余数是( )。

  • A.30
  • B.16
  • C.60
  • D.120

15. 对于节点数为n的树,以下说法正确的是( )。

  • A.所有节点的入度都为1
  • B.将其重链剖分后,每条重链的节点个数不会超过log2(n)
  • C.出度大于根号n的节点数量不会超过根号n个
  • D.两个节点的lca的 dfs序一定大于两个节点本身的dfs序

二、阅读程序(程序输入不超过数组或字符串定义的范围;除特殊说明外,判断题1.5分,选择题3分,共计40分)

1.

# include <iostream>
using namespace std;

int fastpow(int a,int b,int p) {
int ans=1;
a=a%p;
for(int i=0; i<=31; i++) {
if(b&(1<<i)) ans=ans*a%p;
a=a*a%p;
}
return ans;
}
int main() {
int a,b,p;
cin>>a>>b>>p;
cout<<fastpow(a, b,p);
return 0;
}

假设输入的a和b和p都是int范围内的正整数,完成下面的判断题和单选题:

判断题

1) 有必要将第7行和第8行的a*a两侧添加括号。( )
2) 交换第7行与第8行,答案不会改变。( )
3) 缩小b的范围一定不会影响代码的正确性。(指在a,p任意给出时答案仍然正确,下同,且最多缩小至10)。( )
4) 缩小p的范围一定不会影响代码的正确性。( )

选择题

5) 若输入的a为4,b为7,则输出不可能为( )。
6) 以下说法正确的是( )。

2.

#include<iostream>
using namespace std;

int main() {
int n, x; cin >> n>>x;
int a=0, b=0,c=0, na, nb, nc, ans=0;
for(int i=1; i<=n; i++) {
int now;cin>>now;
na = max(a+now, 0);
nb = max(max(a+now*x, b+now*x), 0);
nc = max(max(c+now, b+now), 0);
a= na,b= nb,c=nc;
ans=max(max(ans,a), max(b,c));
}
cout <<ans;
}

假设输入的n、x和now都是绝对值在1000内的整数,完成下面的判断题和单选题:

判断题

1) 一共需要输入n+3个数字。( )
2) 这是一种朴素的未使用任何优化的动态规划算法。( )
3) a表示前个数的最大连续子序列和。( )
4) 在给定的输入范围下,使用int有可能会得到错误答案。( )

选择题

5) 以下说法可能是此算法对应的题目的是( )
6) 以下输入数据得到的结果最大的是( )

3.

# include<bits/stdc++.h>

using namespace std;
typedef long long int_t;

int_t dis[1<<18][18];

struct E {
int_t to,w;
E(int_t to, int_t w):to(to),w(w) {}
};

vector<E> G[20];

int_t dfs(int_t rt, int_t vised, int_t n) {
if(rt ==n-1) return 0;
if(dis[vised][rt]) return dis[vised][rt];
dis[vised][rt]=998244353;
for(E e : G[rt]) {
int_t to=e.to, w= e.w;
if((1<<to) & vised) continue;
dis[vised][rt]=max(dis[vised][rt],dfs(to,vised|(1<<to),n)+w);
}
return dis[vised][rt];
}

int main() {
int_t n,m; cin>> n>> m;
while(m--) {
int_t u,v,w;cin>>u>>v>> w;
G[u].push_back(E(v,w));
}
cout<<dfs(0,1,n);
}

假设输入的n是不超过18的正整数,w不会超过10000完成下面的判断题和单选题:

判断题

1) 此代码可以在noip标准F编译。( )
2) 此代码能处理重边与自环。( )
3) 此算法可以被dijkstra 替代。( )


选择题

4) 以下说法错误的是( )
5) 若以左侧数据为输入数据,则答案为( )
6) 此代码的时间复杂度为( )

三、完善程序(单选题,每题3分,共计30分)

1. (贪心)你用过QQ吗?在QQ群里,管理员可以禁言用户。
在Boboniu的QQ群里,小D每天都开Boboniu的玩笑。
小D会在群里待n天,Boboniu的心情是m。在第i天,如果小D没被禁言,他会开一个严重程度为ai的玩笑;如果开的玩笑严重程度大于m,他就会被Boboniu禁言d天,也就是说,在第i+1,i+2,...,min(i+d,n)天,他都会被禁言。
你可以将序列a重排,求开的所有玩笑的严重程度之和的最大值。
[输入]
第一行是n,d,m,之后一行n个整数ai。
1 ≤d≤n≤=10^5,0≤m≤10^9 ,0≤a≤10^9。
提示:贪心。
试补全程序。

# include <bits/stdc++.h>
using namespace std;

const int MAXN= 1e5 + 5;

int big[MAXN], small[MAXN], sum[MAXN];
int p1=1,p2=1;
int n,m,k,x;

int main() {
cin>> n>> m>> k;
for(int i=1; i<=n; i++) {
cin>>x;
if(x <= k) {
___(1)___;
} else {
big[p2++]=x;
}
}
sort(small+1, small+1+ p1,greater<int>());
sort(big+ 1, big+1 + p2, greater<int>());
for(int i=1; i<=p1; i++) {
___(2)___;
}
int ans= sum[p1], cur = 0;
for(int i=1; i<= p2; i++) {
cur+= ___(3)___;
int days =___(4)___+1;
if(days>n) {
break;
}
int left = min(n-days, p1);
ans=max(ans,___(5)___);
}
cout<< ans<< endl;
return 0;
}


选择题

1) ⑴处应填( )
2) ⑵处应填( )
3) ⑶处应填( )
4) ⑷处应填( )
5) ⑸处应填( )

2. (动态规划)小Q在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3...进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在条通路(通路指连接两个元件的导线序列)。

在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点,而中间节点接收到激励电流后,得到信息,件将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终激励电流将到达一些“终止节点”接收激励电流之后不再转发的节点。

激励电流在导线上的传播是需要花费时间的,对于每条边e,激励电流通过它需要的时间为te,而节点接收到激励电流后的转发可以认为是在瞬间完成的。现在这块电路板要求每一个“终止节点”同时得到激励电路--即保持时态同步。 由于当前的构造并不符合时态同步的要求,故需要改变连接线的构造。目前小Q有一个道具,使用一次该道具,可以使得激励电流通过某条连接导线的时间增加一个单位。请同小Q最少使用多少次道具才可使得所有的“终止节点”时态同步?
输入第一行包含一个正整数N( 1≤n≤5*10^5),表示电路板中节点的个数。
输入第二行包含一个整数S,为该电路板的激发器的编号。
接下来N-1行,每行三个整数a,b,t。表示该条导线连接节点a与节点b,且激励电流通过这条导线需要t(1≤t≤10^6)个单位时间。
提示:动态规划,代码中的read函数调用时会从输入读入一个整数, for(X a: B)会枚举类型X的变量集合B中的每个元素。
试补全程序。

#include<bits/stdc++.h>
using namespace std;

typedef long long int_t;

int read() {
int_t x=0,w=1; char ch=0;
while(!isdigit(ch)) {ch = getchar();if(ch =='-')w=-1;}
while(isdigit(ch)) x=___(1)___, ch=getchar();
return x;
}

struct E {
int_t to,w;
E(int_t to0, int_t w0) {to=to0; w=w0;}
};

int_t ans;
vector<E> G[501000];

int_t dfs(int_t rt, int_t fa) {
int_t ret=0,cnt=0;
for(E e: G[rt]) if(e.to != fa) {
int_t res = dfs(e.to, rt)+ e.w;
if (___(4)___) ans+=cnt*(res-ret),___(3)___,cnt++;
else ___(2)___, cnt++;
}
return ret;
}

int main() {
int_t n =read(), s = read();
for(int_t i=1; i<n; i++) {
int_t u = read(), v = read(), w = read();
G[u].emplace_back(v, w);
G[v].emplace_back(u, w);
}
___(5)___
cout << ans;
return 0 ;
}

选择题

1) ⑴处应填( )
2) ⑵处应填( )
3) ⑶处应填( )
4) ⑷处应填( )
5) ⑸处应填( )