#10627. 提高组CSP-S2025初赛模拟卷10
提高组CSP-S2025初赛模拟卷10
提高组CSP-S2025初赛模拟卷10
一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
- 在NOI Linux 2.0环境下,以下哪条命令能够实现指定C++特定版本进行编译? {{ select(1) }}
- g++-g-std=c++11 main.cpp-omain
- g++-g-std=c++14main.cpp-omain
- g++-g-std=C++17main.cpp-omain
- g++-g-std=c++20main.cpp-omain
- 下面有关格雷码的说法中,错误的是()。 {{ select(2) }}
- 在格雷码中,任意两个相邻的代码在二进制下有且仅有一位不同
- 长度为3的格雷码依次为000,001,010,01,100, 101, 110,111
- 格雷码由贝尔实验室的Frank Gray在20世纪40年代提出
- 格雷码是一种可靠性编码
- 以下哪个选项不属于STL中链表的操作函数?() {{ select(3) }}
- resize
- push_back
- pop
- front
- 下列关于namespace的说法中错误的是()。 {{ select(4) }}
- namespace可以嵌套,例如 namespace X[namespace Y {inti;}}
- namespace只可以在全局定义
- namespace中可以存放变量和函数
- 如果程序中使用using命令同时引用了多个namespace,并且namespace中存在相同的函数,会出现程序错误
- 某哈夫曼树(根结点为第1层)共有7个叶子结点,这棵树的高度不可能是( )。 {{ select(5) }}
- 8
- 6
- 5
- 4
- 现有一段3分钟的视频,它的播放速度是每秒24帧图像,每帧图像是一幅分辨率为1920像素x1080像素的32位真彩色图像。请问要存储这段原始无压缩视频,大约需要多少字节的存储空间?() {{ select(6) }}
- 286.6 GB
- 71.6 GB
- 142.3 GB
- 35.8 GB
- 在桶排序算法中,对于一个长度为 n 的序列,设桶的个数为 m ,在桶内使用插入排序,则其平均时间复杂度是()。 {{ select(7) }}
- O(n m)
- O(n²)
- O(n+m+n²/m)
- O(n+m)
- 以下判断一个整数n是否为奇数的代码中,错误的是( )。 {{ select(8) }}
- if(n%2)
- if(n&1)
- if (n%2==1)
- if (!(n%2==0))
- 下面关于计算机软硬件历史的说法中,错误的是()。 {{ select(9) }}
- 第三代计算机使用了集成电路,降低了计算机的空间占用和成本
- 20世纪80年代,微软公司开发出了MS-DOS操作系统
- 图灵发明了名为"巨人"的计算机,破解了德军的ENIGMA密码
- 第一台基于冯·诺依曼思想的计算机是1946年发明的ENIAC
- p,q为质数,p整除7q+1,q整除7p+1,则有()组不同的p和q组合。 {{ select(10) }}
- 4
- 6
- 8
- 10
- KMP算法属于与()相关的算法。 {{ select(11) }}
- 并查集
- 线段树
- 字符串
- 二分图
- 若集合I={1,2,3,4,5},选择集合I的两个非空子集A和B,要使得B中最小的数大于A中最大的数,一共有( )种不同的选择。 {{ select(12) }}
- 50
- 48
- 47
- 49
- 如果今天是星期一,那么对于任意正整数n,经过2025n+2023n+2025天后是( )。 {{ select(13) }}
- 星期四
- 星期三
- 星期二
- 星期一
- 6名参加信息学竞赛的学生A、B、C、D、E、F站成一排拍照,要求A一定要在B的左边(不一定相邻),一共有()种排列方法。 {{ select(14) }}
- 720
- 360
- 480
- 540
- 设甲、乙两人每次射击命中目标的概率分别为0.75和0.8,且各次射击相互独立,若按甲、乙、甲、乙…·的次序轮流射击,直到有一人击中目标就停止射击,则停止射击时,甲射击了两次的概率是()。 {{ select(15) }}
- 7/120
- 11/240
- 19/400
- 23/480
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
01 #include <bits/stdc++.h>
02
03 const int Max=100005;
04 long long t,n,p[Max],s[Max],a[Max],E;
05
06 int main(){
07 scanf("%Lld",&t);
08 while(t--){
09 scanf("%Lld",&n);
10 for (int i=1;i<=n; i++)
11 scanf("%Lld",&p[i]);
12 for (int i=1; i<=n; i++)
13 scanf("%Lld",&s[i]);
14 for (int i=0; i<=n; i++)
if(p[i]==-1&&s[i+1]==-1){
15
16 E=p[i]^s[i+1];
17 break;
18 }
19 for (int i=0;i<=n; i++){
20 if(p[i]==-1&&s[i+1]!=-1)
21 p[i]=E^s[i+1];
22 else if(p[i]!=-1&&s[i+1]==-1)
23 s[i+1]=E^p[i];
24 else if(p[i]==-1&&s[i+1]==-1)
25 p[i]=1;
26 if(i)
27 printf("%Lld ",p[i]^p[i-1]);
28 }
29 puts("");
30 }
31 }
保证每组数据均有-1 ≤p_i, s_i ≤2^60,且∑[p_i=-1]+∑[s_i=-1]=n,回答下列问题。
判断题
- 如果p[i]是int类型,则与原程序相比,不一定能输出正确答案。
- 将第29行中的puts()函数改成putchar(),程序的输出不变。
- (2分)当n=1时,程序输出p[1]与s[1]中非-1的那个数。
- (2分)E不会大于pi和si的最大值。
选择题
- 若程序输入为
1
4
-1-1-1-1
2357
则程序输出为( )。 {{ select(20) }}
- 1627
- 7261
- 2612
- 2162
- 若程序输入为
1
4
-134367-1
3178-1-13333
则程序输出中的第三个数为( )。 {{ select(21) }}
- 3333
- 333
- 3178
- 267
(2)
01 #include <bits/stdc++.h>
02 using namespace std;
03 const int NR=1e3+10;
04 int n,s,t,ans=1000, a[NR],b[NR],f[2][NR];
05
06 int main(){
07 cin>>n>>s>>t;
08 if(s>=t){
09 for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
10 puts("0");
11 return 0;
12 }
13 memset(f[0],-9999,sizeof(f[0]));f[0][0]=s;
14 for(int i=0;i<ans;i++){
15 int now=i&1,pre=now^1;
16 for(int j=0;j<=t;j++)
17 for(int k=1;k<=n;k++)
if(f[now][j]!=-9999){
18
19 if(j+b[k]<=t)
f[now][j+b[k]]=max(f[now][j+b[k]],f[now][j]-a[k]);
20 else ans=i+1;
21 }
22 memset(f[pre],-9999,sizeof(f[pre]));
23 for(int j=0;j<=t;j++)
24 if(f[now][j]+j>=t) ans=i+1;
25 else f[pre][j]=f[now][j]+j;
26 }
27 cout<<ans<<endl;
28 return 0;
29 }
假设数据满足1 ≤n ≤100,1 ≤s;t ≤1000,1 ≤a_i,b_i ≤2^31,回答下列问题。
判断题(每题2分)
- 将第22行中的-9999999改为-1,程序输出不变。
- 本段代码的时间复杂度为O(n³)。
- 本段代码使用了滚动数组优化f数组空间。
选择题
- 假设某组输入为
1 18
11
则程序输出为( )。 {{ select(25) }}
- 1
- 2
- 3
- 4
- 假设某组输入为
218
11
28
则程序输出为( )。 {{ select(26) }}
- 1
- 2
- 3
- 4
- 如果删除第22行代码,则在输入相同时,程序输出与原来相比( )。 {{ select(27) }}
- 变大或不变
- 不变
- 变小或不变
- 以上情况都有可能
(3)
01 #include <bits/stdc++.h>
02
03 #define int long long
04 using namespace std;
05
06 const int INF=3e5+5;
07
08 string s1;
09 int sum[INF][35],t[35],La[35],la1[35];
10
11 int check(int l,int r){
12 int ans=0;
13 for (int i=0;i<26;i++)
14 if(sum[r][i]-sum[l-1][i])ans++;
15 return ans;
16 }
17
18 signed main()
19 {
20 ios::sync_with_stdio(false);
21 cin>>s1;int len=s1.size();s1=" "+s1;
22 for(int i=1;i<=len;i++){
23 for(int j=0;j<26;j++)
24 sum[i][j]=sum[i-1][j]+((s1[i]-'a')==j);
25 }
26 for (int i=1;i<=26;i++){
27 int j1=0,j2=0,sum1=0,sum2=0;
28 for (int k=1;k<=len;k++){
29 j1=max(j1,k-1);j2=max(j2,k-1);
30 while (j1+1<=len&&sum1<=i){
31 if(La[s1[j1+1]-'a']==0&&sum1==i)break;
32 La[s1[j1+1]-'a']++;
33 if (La[s1[j1+1]-'a']==1) sum1++;
34 j1++;
35 }
36 while (j2+1<=len&&sum2<i){
37 la1[s1[j2+1]-'a']++;
38 if (la1[s1[j2+1]-'a']==1) sum2++;
39 j2++;
40 }
41 if(sum2==i&&sum1==i)t[i]+=j1-j2+1;
42 la1[s1[k]-'a']--;
43 if (la1[s1[k]-'a']==0) sum2--;
44 la[s1[k]-'a']--;
45 if(La[s1[k]-'a']==0)sum1--;
46 }
47 }
48 cout<<check(1,len)<<"\n";
49 for(int i=1;i<=26;i++)
50 if(t[i])cout<<t[i]<<"\n";
51 return 0;
52 }
输入数据满足1 ≤|s1| ≤10^5,且为小写字母组成的字符串。
判断题
- 程序第一个输出的数字可能为0。
- 在第9行声明数组时,如果将声明t[35]改成t[25],程序一定发生运行错误。
选择题
- 若程序输入abca,则程序输出的最大值是( )。 {{ select(30) }}
- 1
- 2
- 3
- 4
- 程序在第50行输出的数字之和与字符串s1长度n的关系为( )。 {{ select(31) }}
- 等于(n*(n+1))/2
- 小于(n*(n+1))/2
- 大于(n*(n+1))/2
- 以上都有可能
- 当输入一个长度为n的字符串时,代码j1j2移动的最大次数约为()。 {{ select(32) }}
- N
- n*n
- 26*n
- 26nn
三、完善程序(单选题,每小题3分,共计30分)
(1)题目描述:
有一个H行W列的网格,每一格都被涂成黑色或白色。 形式化地,有H个长为W的字符串S1,S2,.,SH。若Si.j是#,则网格中第i行第j列被涂为黑色;若Si.j是,则网格中第i行第j列被涂为白色。 若有一条从黑色方格到达白色方格的路径,途中只沿水平或垂直方向移动,所经相邻方格颜色不同,我们将这条路径称为合法路径。 求网格中有多少合法路径。
01 #include <bits/stdc++.h>
02 #define ll long long
03 #define ri register
04 #define al(x)x.begin(),x.end()
05 using namespace std;
06 const int N=401,M=N*N;
07 int n,m,f[M],g[M],sz[M];
08 ll ans;
09 char a[N][N];
10 inline int ord(int x,int y){return ①;}//压成一位
11 inline int find(int z){return f[z]==z?z:②;}//并查集
12 inline void merge(int x,int y){
13 x=find(x),y=find(y);
14 if(x==y) return;
15 f[x]=y,sz[y]+=sz[x],g[y]+=g[x];
16 sz[x]=g[x]=0;
17 }
18 int main(){
19 scanf("%d%d",&n,&m);
20 for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
21 for(int i=1;i<=n;i++)
22 for(int j=1;j<=m;j++)
23 if(③)a[i][j]=④,g[ord(i,j)]++;
24 for(int i=1;i<=n*m;++i)sz[i]=1,f[i]=i;
25 for(int i=1;i<=n;i++)
26 for(int j=1;j<=m;j++){
27 if(a[i][j]==a[i+1][j])
28 merge(ord(i,j),ord(i+1,j));
29 if(a[i][j]==a[i][j+1])
30 merge(ord(i,j),ord(i,j+1));
31 }
32 for(int i=1;i<=n*m;i++)
33 if(f[i]==i)ans+=⑤;
34 printf("%lld\n",ans);
35 return 0;
36 }
- ①处应填( )。 {{ select(33) }}
- y*m+X
- (y-1)*m+X
- (x-1)*m+y
- (x-1)*n+y
- ②处应填()。 {{ select(34) }}
- f[z]:z
- f[z]=find(f[z]):z
- z:f[z]=find(z)
- z:f[z]=find(f[z])
- ③处应填( )。 {{ select(35) }}
- (i+j)==1
- (i+j)%2
- (i-j)%2==1
- (i*j)%2
- ④处应填()。 {{ select(36) }}
- a[i][j]=='#'?".':"#'
- a[i][j]=='.'?".':"#'
- ~a[i][j]
- a[i][j]
- ⑤处应填()。 {{ select(37) }}
- 1ll*g[i]*sz[i]
- 1LLg[i](sz[i]-g[i])
- 1llg[i](sz[i]-1)
- g[i]
(2)题目描述:
给定n个由大写字母组成的字符串,选择尽量多的串,使得每个大写字母都出现偶数次。n ≤24。 (提示:采用折半搜索策略。)
01 #include <bits/stdc++.h>
02 #define MAXN 35
03 #define MAXM10005
04 using namespace std;
05 map<int,int>m;
06 int n,has[MAXN];
07 char ch[MAXM];
08
09 int lowbit(int x)
10 {
11 return x&-x;
12 }
13
14 int Calc(int x)
15 {
16 int res=0;
17 for(;①;res++);
18 return res;
19 }
20
21 int main()
22 {
23 while(cin>>n)
24 {
25 m.clear();
26 memset(has, 0, sizeof(has));
27
28 for(int i=0;i<n;i++){
29 scanf("%s",ch+1);
30 int len=strlen(ch+1);
31 for(int j=1;j<=len;j++)has[i]^=1<<(ch[j]-65);
32 }
33 int ans=0,n1=②,n2=n-n1;
34 for(int i=0;i<(1<<n1);i++)
35 {
36 int x=0;
37 for(int j=0;j<n1;j++)if(i&(1<<j))x^=has[j];
38 if(③)m[x]=i;
39 }
40 for(int i=0;i<(1<<n2);i++)
41 {
42 int x=0;
43 for(int j=0;j<n2;j++)if(i&(1<<j))x^=has[n1+j];
44 if(④)ans=max(ans,Calc((i<<n1)|m[x]));
45 }
46 printf("%d\n",Calc(ans));
47 for(int i=0;i<n;i++)if(⑤)printf("%d ",i+1);
48 puts("");
49 }
50 return 0;
51 }
- ①处应填( )。 {{ select(38) }}
- x<=n;x+=lowbit(x)
- X<=n;x-=lowbit(x)
- x;x-=lowbit(x)
- x;x+=lowbit(x)
- ②处应填()。 {{ select(39) }}
- 1
- n/2
- n-1
- n
- ③处应填( )。 {{ select(40) }}
- !m.count(x)||Calc(m[x])<Calc(i)
- !m.count(x)||Calc(m[x])<Calc(i)
- m.count(x)&&Calc(m[x])<Calc(i)
- m.count(x)||Calc(m[x])<Calc(i)
- ④处应填()。
{{ select(41) }}
- m.count(x)||Calc(ans)>Calc((i<<n1)|m[x])
- m.count(x)||Calc(ans)<=Calc((i<<n1)|m[x])
- m.count(x)&&Calc(ans)<Calc((i<<n1)|m[x])
- m.count(x)&&Calc(ans)>=Calc((i<<n1)|m[x])
- ⑤处应填()。
{{ select(42) }}
- ans&(1<<i)
- ans|(1<<i)
- ans&(1<<(i-1))
- ans|(1<<(i-1))