CSP-J 第一轮精品原创定心卷(一)
(考试时间:120分钟)
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
-
下面哪种语言为弱类型语言? ( )
A.Java
B.C
C.C++
D.JavaScript -
1979 年 8 月 1 日是星期三,请问在 2030 年的 8 月 1 日是星期几?( )
A.星期一
B.星期二
C.星期三
D.星期四 -
ENIAC 作为世界上第一台通用计算机,诞生于( )年?
A.1945
B.1946
C.1949
D.1952 -
八进制数 73.6 对应的二进制数是( )
A.111101.11
B.111011.11
C.110111.11
D.110111.01 -
有 N 个点的强连通图最少要几条有向边( )
A.N-1
B.N
C.n+1
D.N(N ? 1) -
已知前序遍历 ACDEFGB,中序遍历为 DFECABG,后序遍历为( )
A.FEDCBGA
B.DFECBGA
C.FEDBGCA
D.FEDBCGA -
以下哪个设备为输入设备( )
A.扫描仪
B.打印机
C.投影仪
D.显示器 -
树根高度设为 1,100 个结点的树最大的高度和最小的高度的差是多少( )
A.50
B.92
C.93
D.99 -
考虑一个有 n 个元素的排列,若一个排列中所有的元素都不在自己原来的位
置上,那么这样 的排列就称为原排列的一个错排 。求 5 个元素的错排数( )
A.41
B.42
C.43
D.44 -
先有字符串 s=“abababbaa”,有多少不同的子串( )
A.29
B.30
C.31
D.32 -
关于网络技术的说法,错误的是( )
A.LAN 是局域网,学校机房里用的是 LAN。
B.无线网络中数据通信不需要介质。
C.网络协议是实现不同网络之间正确通信的基础
D.移动终端之间不仅仅只能通过移动通信网络进行通信。 -
有 1 个队列,队首到队尾的元素依次为 8 ,3 ,2 ,9 ,5。约定: T 操作是指队列中 1 个元素 出队后再入队, Q 操作是指队列中 1 个元素出队。则经过 TTTQTTQ 系列操作后,队列中队 首到队尾的元素依次为( )
A.2 ,9 ,5
B.2 ,5 ,8
C.5 ,8 ,2
D.8 ,3 ,2 -
定义如下函数:
1 int rf(n) {
2 if (n<3) return;
3 return rf(n-1)+rf(n-3);
4 }
执行语句 v=rf(5),函数 rf 被调用的次数是()
A.11
B.5
C.7
D.15
- 下列关于信息编码的说法,正确的是( )
A.十进制数 36 转换为二进制数后,该二进制数中 1 的个数为 4
B.二进制整数最右边增加 1 位后,奇偶性不会发生变化
C.某字符的 ASCII 码十六进制表示为 74,在计算机中存储为二进制编码 01110100
D.扫描文字稿生成只有黑、白两种颜色的图像,每个像素至少用两位二进制数编码
15.将帧频为 10fps,时长为 12 秒,总数为 120 的 Fash 动画作品导出为未经压缩的无声 AVI 视频文件,其参数为 1024*768 像素、24 位真彩色,则该视频文件的存储容量约为( )
A.270MB
B.216MB
C.31.64GB
D.2.1GB
二、阅读程序(程序输入不超过数组或字符串定义的 范围;判断题正确填 T ,错误填 F ;除特殊说明外,判断题 2.5 分,选择题 3 分,共计 40 分)
#include<bits/stdc++.h>
using namespace std;
int ans=0;
int f(int n) {
int a = 1,b = 2,c = 3,x = 1;
for(int i = 1; i <= n; ++i) {
x = a ^ b ^ x;
a = -~a;
b = ~-b + 2;
c = -(c ^ -1) + 1;
}
return ((x ^ c) >> 1) + (x & c);
}
int main() {
int n,ans=(10101 >> 2) & 1;
cin>>n;
for(int i = 1; i <= n; ++i) {
ans = ans + f(i);
cout<<ans;
return 0;
}
判断题
(1)程序的复杂度为 n2。( )
(2)该程序输入为 0 时,输出为 0 。( )
(3)把函数中 b = 2 改成 b = 1 时,答案不会发生变化。( )
(4)c 的值是奇数。( )
(5)当 n 是奇数时,答案是偶数( )
单项选择题
(6)当输入为 6 时,输出为( )。
A.21
B.43
C.55
D.61
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1010][1010],Map[1010][1010],sum,vis[1010][1010];
int dx[]= {1,-1,0,0,1,1,-1,-1};
int dy[]= {0,0,1,-1,-1,1,-1,1};
int anss=0;
void dfs(int x,int y) {
anss++;
vis[x][y]=1;
for(int i=0; i<=7; i++) {
int tx=x+dx[i],ty=y+dy[i];
if(Map[tx][ty]==0&&vis[tx][ty]==0&&tx>0&&tx<=n&&ty>0&&ty<=m)dfs(tx,ty);
}
}
void paint(int x,int y) {
Map[x][y]=9;
for(int i=0; i<=7; i++)if(Map[x+dx[i]][y+dy[i]]!=9)Map[x+dx[i]][y+dy[i]]++;
}
bool check(int x,int y) {
for(int i=0; i<=7; i++)if(Map[x+dx[i]][y+dy[i]]==0)return false;
return true;
}
void solve() {
anss=0;
scanf("%d%d",&n,&m);
for(int i=0; i<=m+1; i++)Map[0][i]=Map[n+1][i]=1;
for(int i=0; i<=n+1; i++)Map[i][0]=Map[i][m+1]=1;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) {
scanf("%d",&a[i][j]);
if(a[i][j]==1)
paint(i,j);
}
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(Map[i][j]==0&&vis[i][j]==0) {
sum++;
dfs(i,j);
} else {
if(Map[i][j]!=9&&check(i,j))
anss++,sum++;
}
printf("%d\n",sum+anss);
}
int main() {
int T;
cin>>T;
while(T--) {
solve();
}
}
判断题
(1)anss=n*m 一直成立。( )
(2)T 大于 1 时,2 组同样的数据结果可能一样。( )
单项选择题
(3)输入为以下内容时,输出结果为( )
1
5 5
1 0 0 0 1
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
1 0 0 0 1
A.10
B.13
C.15
D.17
(4)输入为以下内容时,输出结果为()
1
9 9
0 0 0 1 1 0 0 0 0
1 0 0 1 0 0 0 1 1
1 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
1 1 1 0 0 0 1 0 1
A.43
B.47
C.49
D.51
判断题
(1)输入为 30000 时,代码运行时间不会超过 1s 。( )
(2)去除 if(n==1) return 0;
行,会影响输出的结果。( )
(3)将 fc[prime[j]*i]=prime[j];
改成 fc[prime[j]*i]+=prime[j];
后,phi 数组是单调增的,但是 fc 数组不是。( )
单项选择题
(4)输入为 10 时,输出为( )
A. 40
B. 56
C. 60
D. 64
(5)在执行完 ans(100) 后,fc[1],fc[2],fc[3]…fc[100]
中有( )个等于 2。
A. 5
B. 15
C. 25
D. 50
三、完善程序 (单项选择题,每小题 3 分,共计 30 分)
在一个数轴上有 n 条线段,现要选取其中 k 条线段使得这 k 条线段两两没有重合部分,问最大的 k 为多少。
#include<bits/stdc++.h>
using namespace std;
struct q {
int l,r;
} game[1000005];
bool cmp(q a,q b) {
if(a.r!=b.r)① ;
②;
}
int f[1000005];
int i,n,temp;
int main() {
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d%d",&game[i].l,&game[i].r);
sort(game+1,game+1+n,cmp);
for(i=1; i<=n; i++) {
while(③)
temp=④;
f[i]=⑤;
}
printf("%d\n",f[n]);
return 0;
}
1.①处应填 ( )
A. return a.r<b.r;
B. return a.r<b.l;
C. return a.l<b.r;
D. return 0;
2.②处应填 ( )
A. return a.l<b.l;
B. return a.r<b.r;
C. return a.r<b.l;
D. return a.l<b.r;
3.③处应填 ( )
A. game[temp+1].r<=game[i].l
B. game[temp+1].r<=game[i].r
C. game[temp].r<=game[i].l
D. game[temp].r<=game[i].r
4.④处应填 ( )
A. ~-temp
B. temp++
C. ++temp
D. temp<<1
5.⑤处应填 ( )
A. min(f[i-1],f[temp]);
B. min(f[i-1],f[temp]+1);
C. max(f[i-1],f[temp]);
D. max(f[i-1],f[temp]+1);
- (次短路)给定一张有权图,如何求某两点之间的倒数第二短的路径?
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000007
struct edge {
int x,y,w;
} dd[maxn];
struct hh {
int nex,to,dis;
} t[maxn];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q2;
int n,m,cnt=0,ans,mi;
int vis[maxn],d1[maxn],d2[maxn],head[maxn];
inline int read() {
char kr=0;
char ls;
for(; ls> '9' ||ls< '0'; kr=ls,ls=getchar());
int xs=0;
for(; ls>= '0'&&ls<= '9'; ls=getchar()) {
xs=xs*10+ls-48;
}
if(kr== '-') xs=0-xs;
return xs;
}
inline void add(int nex,int to,int w) {
①;
t[cnt].to=to;
t[cnt].dis=w;
head[nex]=cnt;
}
inline void dijkstra_first(int ww) {
memset(d1,0x3f3f3f3f,sizeof(d1));
memset(vis,0,sizeof(vis));
q1.push(make_pair(0,ww));
d1[ww]=0;
while(!q1.empty()) {
int u=q1.top().second;
q1.pop();
if(vis[u]) continue;
vis[u]=1;
for(int v=head[u]; v; v=t[v].nex) {
if(d1[t[v].to]>d1[u]+t[v].dis&&!vis[t[v].to]) {
d1[t[v].to]=d1[u]+t[v].dis;
q1.push(make_pair(d1[t[v].to],t[v].to));
}
}
}
}
inline void dijkstra_second(int ww) {
memset(d2,0x3f3f3f3f,sizeof(d2));
memset(vis,0,sizeof(vis));
q2.push(make_pair(0,ww));
d2[ww]=0;
while(!q2.empty()) {
int u=q2.top().second;
q2.pop();
if(vis[u]) continue;
vis[u]=1;
for(int v=head[u]; v; v=t[v].nex) {
if(d2[t[v].to]>d2[u]+t[v].dis&&!vis[t[v].to]) {
d2[t[v].to]=d2[u]+t[v].dis;
q2.push(make_pair(d2[t[v].to],t[v].to));
}
}
}
}
void init() {
n=read();
m=read();
ans=999999;
mi=999999;
for(int i=1; i<=m; ++i) {
dd[i].x=read();
dd[i].y=read();
dd[i].w=read();
add(dd[i].x,dd[i].y,dd[i].w);
②;
}
}
void solve() {
dijkstra_first(1);
dijkstra_second(n);
int minn=d1[n];
for(int i=1; i<=m; i++) {
int x=dd[i].x,y=dd[i].y;
if(d1[x]+d2[y]>d1[y]+d2[x]) swap(x,y);
int s=d1[x]+d2[y];
if(s+dd[i].w==minn) continue;
ans=min(ans,s+dd[i].w);
}
for(int i=1; i<=m; i++) {
int x=dd[i].x,y=dd[i].y;
if(③) swap(x,y);
if(④) continue;
mi=min(mi,dd[i].w);
}
ans=⑤;
}
void print() {
printf("%d\n",ans);
return;
}
int main() {
init();
solve();
print();
return 0;
}
1.①处应填 ( )
A. t[++cnt].nex=head[nex];
B. t[1+cnt].nex=head[nex];
C. t[++cnt].nex=head[++nex];
D. t[++cnt].nex=head[1+nex];
2.②处应填 ( )
A. add(dd[i].x,dd[i].y,-dd[i].w);
B. add(dd[i].y,dd[i].x,-dd[i].w);
C. add(dd[i].x,dd[i].y,dd[i].w);
D. add(dd[i].y,dd[i].x,dd[i].w);
3.③处应填 ( )
A. d1[y]+d2[x]>d1[x]+d2[y]
B. d1[x]+d2[y]>d1[y]+d2[x]
C. d1[x]+d2[y]<d1[y]+d2[x]
D. d1[y]+d2[x]<d1[x]+d2[y]
4.④处应填 ( )
A. d1[y]+d2[x]+dd[i].w != minn
B. d1[x]+d2[y]+dd[i].w != minn
C. d1[y]+d2[x]+dd[i].w == minn
D. d1[x]+d2[y]+dd[i].w == minn
5.⑤处应填 ( )
A. min(ans,minn)
B. min(ans,minn+mi)
C. min(ans,minn+mi * 2)
D. max(ans,minn)