2021提高组 CSP-S 初赛模拟试题 (1)

一、单选题(每题 2 分,共 30 分)
第 1 题 大多数计算机病毒会主要造成计算机()的损坏。
第 2 题 假设今年中秋有253个月饼,把它们装到15个盒子里面,那么数量最多的一盒至少装几 个月饼?( )
第 3 题 ASCII编码是由美国国家标准委员会指定的一种包括数字、字母、通用字符和控制符号在内的字符编码集,它是一种( )位二进制编码。
第 4 题 计算机的硬件主要包括控制器、( )、存储器、输入设备、输出设备。
第 5 题 字符“a”的ASCII码是97,写出下面程序的输出结果:char c='a'+4;cout<<c<<","<< (int)c+3<<endl;( )
第 6 题 操作系统是对( )进行管理的软件。
第 7 题 以下选项中( )不是一个操作系统环境。
第 8 题 以下关于 C++ 语言注释的说法正确的是( )。
第 9 题 要使用putchar 函数实现向显示器输出字符“A”,则可以使用( )。
第 10 题 两个指针( )。
第 11 题 下列属于B类IP的是( )。
第 12 题 现有变量 a,b,c,d ,取值范用均为[0,15],假设每个值出现的概率相同,则表达式 a⊕b⊕c⊕d的值能被3整除的概率()。(⊕为计算机中的异或运算符,结果用分数形式表达)
第 13 题 假设以S和X分别表示进钱和出栈操作,则对输入序列a,b,c,d,e进行一系列栈操作SSXSXSSXXX 之后,得到的输出序列为()
第 14 题 某递归算法的执行时间的递推关系如下: 当n=1时,T(n)=1; 当n>1时,T(n)=2*T(n/2)+1。则该算法的时间复杂度为( )
第 15 题 一棵完全二叉树有501个叶子节点,则至少有( )个节点。
二、判断题(每题 2 分,共 20 分)
第 16 题
#include <iostream>
using namespace std;

const int maxn=100001;

int N,M,K;
int x[maxn], y[maxn],d[maxn];
int c[maxn];
int *a[maxn];

int main() {
    cin>>N>>M>>K;
    for (int i=0; i<K; ++i) {
        cin >>x[i]>>y[i]>>d[i];//表示第x[i]行第y[i]列的值为d[i]
        c[y[i]]++;
    }
    for (int i=1; i<=M; ++i)
        a[i]=new int[c[i]];
    for (int i= 0; i<K; ++i) {
        *a[y[i]]=d[i];
        a[y[i]]++;
    }

    for (int i=1; i<=M; ++i) {
        a[i]=a[i]-c[i];
        for (int j=0; j<c[i]; ++j,++a[i])
            cout <<*a[i]<<" ";
    }
    return 0;
}
判断题
第 16 题 程序第9行定义了一个指针数组,a[i]表示第i列的指针。( )
第 17 题 第20行代码改成a[y[i][0]=d[i]不影响运算结果。( )
第 18 题 第15行中,数组c用来统计每行中的数据个数。( )
第 19 题 本程序中,采用动态数组以优化空间的利用,每一列数组长度可能不同。
第 20 题 该程序的时间复杂度为( )。
第 21 题 该程序的空间复杂度为( )。
第 23 题
#include <iostream>
#include <iomanip>
using namespace std;

int m[101][101];

int main() {
    int a;
    cin>> a;

    int c=a*a, i=1, k=(a+1)/2;
    for (int j=1; j<=c; j++) {
        m[i][k] = j;
        if (j%a==0) {
            if (i==a)
                i=1;
            else
                i++;
        } else {
            if (i==1)
                i=a;
            else
                i--;
                
            if (k==a)
                k=1;
            else
                k++;
        }
    }
    for (int i=1; i<=a; i++) {
        for (int j=1; j<=a; j++)
            cout<<setw(5) << m[i][j];
        cout<<endl;
    }
    return 0;
}
判断题
第 23 题 从程序可以看出,i为被填数,j和k为填数位置。
第 24 题 填数结束后,数组m中的元素互不相同。
第 25 题 当j%a==0且i!=a,下一步填入的量( )
第 26 题 当j%a!=0, i!=1且k==a时,下一步填入的是( )
第 27 题 填数后,每行每列及对角线的和均为( )
第 29 题
#include <iostream>
using namespace std;

int a[101],d[101];

int main() {
    int n=5;
    a[1]=d[1]=1;
	for (int i=1; i<=n; ++i) {
		int s=i+1,x=0;
		for (int j=1; j<=n+1-i; ++j){
			int k=s+x;
			x++;
			
			a[j+1]=a[j]+k;
			cout<<a[j]<<' ';
		}
		cout<<"..."<<endl;
		a[1]=d[i+1]=d[i]+i;
	}       
    return 0;
}
判断题
第 29 题 该题有两重循环构成,外循环i控制列的变化,内循环j是控制行的变化。()
第 30 题 这段代码的运行结果是(左图) 。()
第 31 题 本题在输出时,每行为 ( ) 个a[j]数组的值。
第 32 题 这题代码的运行结果是输出( )行。
三、编程题(每题 25 分,共 50 分)
第 34 题 形如2^p-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^p-1不一定是素数。到1998年底,人们已找到了37个麦森数。最大的一个是p=321377,它有90952位。麦森数有许多重要应用,它与完全数密切相关。 你的任务:输入P(1000# include <cstdio> # include <memory> # include <cmnth> #define LEN 125 void Mutiply(int *a, int *b) { int i, i; int nCarry; int nTmp; int c[LEN]; memset(c, 0, sieof(int)*LEN); for(i=0; i<LEN; i++) { nCarry = 0; for (j=0; ___(1)___; j++) { nTmp=c[i+j]+ a[j]*b[i] + nCarry; e[i+ j]=nTmp % 10000; nCarry=nTmp /10000; } } memcpy(a,c, LEN*sizeof(int)); } int main() { int i; int p; int anPOW[LEN]; int aResult[LEN]; scanf("%d", &p); print("%d\n", (int)(p*log10(2))+1); anPow[0]=2; aResult[0]=1; for(i=1; i<LEN; i++) { anPow[i]=0; aResult[i]=0; } while(___(2)___) { if( ___(3)___) Multiply(aResult,anPow); p>>=1; Muliply(anPow,anPow); } aResult[0]--; for(i=LEN-1; i>= 0; i--) { if(___(4)___) printf("%02d\n%02d",aResult[i]/100, aResult[i]%100); else { printf("%04d",aResult[i]); if(i%25==0) printf("\n"); } } return 0; }
第 34 题 ①处应填( )
第 35 题 ②处应填( )
第 36 题 ③处应填( )
第 37 题 ④处应填( )
第 39 题 在通远的国家佛罗布尼亚,嫌犯是否有罪须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团。选m人的办法: 控方和辩方会根据对候选人的喜欢程度给所有候选人打分,分值从0到20。为了公平起见,法官选出陪审团的原则是选出的m个人,必须满足辩方总分和控方总分的差的绝对值最小。如果有多种选择方案的解方总分和控方总分之差的绝对值相同,那么选辩控双方总分之和最大的方案即可。最终选出的方案称为陪审团方案。 输入数据: 输入包含多组数据。每组数据的第一行是两个整数n和m,n是候选人数目,m是陪审团人数。注意,1≤n≤200, 1≤m≤20,而且m≤n。接下来的n行,每行表示一个候选人的信息,它包含2个整数,先后是控方和辩方对该候选人的打分。候选人按出现的先后从1开始编号。两组有效数据之间以空行分隔,最后一组数据n=m=0。 输出要求: 对每组数据:先输出一行,表示答案所属的组号, 如“lury #1”, “lury #2”,等。接下来的一行要象例子那样输出陪审团的控方总分和辨方总分。再下来一种要以长序输出陪审团里每个成员的编号,两个成员编号之间用空格分隔。每组输出出数据须以一个空行结束。
#include <cstdio>
#include <cstdlib>
#include <memory>
#include <algorithm>

int f[30][1000];
int Path[30][1000];
int P[300];
int D[300];
int Answer[30];

int main() {
    int i,j,k;
    int t1,t2;
    int n,m;
    int nMinP_D;
    int nCaseNo;
    nCaseNo=0;

    scanf("%d%d",&n,&m);
    while(n+m) {
        nCaseNo++;
        for(i=1; i<=n; i++)
            scanf("%d%d",&P[i],&D[i]);
        memset(f,-1,sizeof(f));
        memset(Path,0,sizeof(Path));
        nMinP_D=___(1)___;
        ___(2)___;
        for(j=0; j<m; j++) {
            for(k=0; ___(3)___; k++)
                if (___(4)___) {
                    for (i=1; i<=n; i++)
                        if (___(5)___) {
                            t1=j;
                            t2=k;
                            while(t1>0&&Path[t1][t2]!=j) {
                                t2-=P[Path[t1][t2]]-D[Path[t1][t2]];
                                t1--;
                            }
                            if (t1==0) {
                                f[j+1][k+P[i]-D[i]]=f[j][j]+P[i]+D[i];
                                Path[j+1][k+P[i]-D[i]]=i;
                            }
                        }
                }
        }
        i=nMinP_D;
        j=0;
        while (f[m][i+j]<0 && f[m][i-j]<0) j++;
        if(f[m][i+j]>f[m][i-j])
            k=i+j;
        else
            k=i-j;
        printf("Jury #%d\n", nCaseNo);
        printf("Best jury has value %d for prosccution and value %d for delencen:\n",(k-nMinP_D + f[m][k]) /2, (f[m][k]-k + nMinP_D) / 2);
        for(i=1; i<=m; i++) {
            ___(6)___;
            k =- P[Answer[i]] - D[Answer[i]];
        }        
        std::sort(Answer + 1, Answer + m + 1);
        for(i= 1; i<= m; i++) printf(" %d", Answer[i]);
        printf("\n");
        printf("\n");
        scanf("%d%d", &n, &m);
    }
    return 0;
}
第 39 题 ①处应填( )
第 40 题 ②处应填( )
第 41 题 ③处应填( )
第 42 题 ④处应填( )
第 43 题 ⑤处应填( )
第 44 题 ⑥处应填( )