学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年CSP-J初赛真题解析 | 汇总_热爱编程的通信人的博客-CSDN博客
#include <cstdio>
#include <cstring>
using namespace std;
char st[100];
int main() {
scanf("%s", st);
int n = strlen(st);
for (int i=1; i<=n; ++i) {
if (n % i == 0) {
char c = st[i-1];
if (c >= 'a')
st[i-1] = c - 'a' + 'A';
}
}
printf("%s", st);
return 0;
}
第16题
输入的字符只能由小写字母或大写字母组成。( )
A.对
B.错
【答案】:B
【解析】
输入c为空格,第11行的if语句不发生,输出结果也没有影响。
第17题
若将第8行的"i=1"改为"i=0",程序运行时会发生错误。( )
A.对
B.错
【答案】:A
【解析】
i=0,n%0,程序会报错
第18题
若将第8行的"i<=n"改为"i*i<=n",程序运行结果不会改变。( )
A.对
B.错
【答案】:B
【解析】
使用代入法计算,超过 n \sqrt n n 的数,虽然也是n的约数,但语句却未执行
第19题
若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样。( )
A.对
B.错
【答案】:A
【解析】
输入字符串都是大写字母,第11行语句不会执行,输出也都是大写字母
第20题
若输入的字符串长度为18,那么输入的字符串跟输出的字符串相比,至多有( )个字符不同。
A.18
B.6
C.10
D.1
【答案】:B
【解析】
18的约数个数是6个,分别为1,2,4,8,9,16
第21题
若输入的字符串长度为( ),那么输入的字符串跟输出的字符串相比,至多有36个字符不同。
A.36
B.100000
C.1
D.128
【答案】:B
【解析】
就是求那个长度有36个约数。
10000 = 2 5 × 5 5 10000=2^5 \times 5^5 10000=25×55,(5+1) * (5+1)=36,就是10000的约数个数
#include <cstdio>
using namespace std;
int n,m;
int a[100], b[100];
int main() {
scanf("%d%d", &n, &m);
for (int i=1; i<=n; ++i)
a[i] = b[i] = 0;
for (int i=1; i<=m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
if (a[x]<y && b[y]<x) {
if (a[x]>0)
b[a[x]] = 0;
if (b[y]>0)
a[b[y]] = 0;
a[x] = y;
b[y] = x;
}
}
int ans = 0;
for (int i=1; i<=n; ++i) {
if (a[i]==0)
++ans;
if (b[i]==0)
++ans;
}
printf("%d\n", ans);
return 0;
}
假设输入的n和m都是正整数,x和y都是在[1,n]范围内的整数,完成下面的判断题和单选题:
第22题
当m>0时,输出值一定小于2n。( )
A.对
B.错
【答案】:A
【解析】
假设n=5,m=5
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
a | 0 | 0 | 0 | 0 | 0 |
b | 0 | 0 | 0 | 0 | 0 |
x=2,y=4后a,b | 0 | 4 | 0 | 0 | 0 |
0 | 0 | 0 | 2 | 0 | |
x=4,y=2后a,b | 0 | 4 | 0 | 2 | 0 |
0 | 4 | 0 | 2 | 0 | |
x=3,y=5后a,b | 0 | 4 | 5 | 2 | 0 |
0 | 4 | 0 | 2 | 3 | |
x=4,y=4后a,b (原先x=3) | 0 | 0 | 5 | 4 | 0 |
0 | 0 | 0 | 4 | 3 | |
x=4,y=5后a,b | 0 | 0 | 0 | 5 | 0 |
0 | 0 | 0 | 0 | 4 |
最后计算ans=8。
题目是求当x出现多次时,选择对应y的最大值,以及y出现多次时,选择对应x的最大值。如果不再选择,则将其改为0。如x=4,y=2。
执行第13行后,第一对x和y,就会执行第18和第19行,就一定有a[i]或b[i]不等于0,则ans一定小于2n。
第23题
执行完第27行的"++ans"时, ans一定是偶数。( )
A.对
B.错
【答案】:B
【解析】
n=2,m=1,x=1,y=2,i=1时,ans就是1。
第24题
a[i]和b[i]不可能同时大于0。( )
A.对
B.错
【答案】:B
【解析】
刚才举例中,x=4,y=4,执行后a[i]和b[i]同时大于0
第25题
若程序执行到第13行时,x总是小于y,那么第15行不会被执行。( )
A.对
B.错
【答案】:B
【解析】
程序中都是x与x比较,y与y比较,与x和y的大小关系无关,按之前的举例,第15行就被执行了。
第26题
若m个x两两不同,且m个y两两不同,则输出的值为( )。
A.2n-2m
B.2n+2
C.2n-2
D.2n
【答案】:A
【解析】
如果都是两两不同,每次都是2m个0小时,所以最后ans=2n-2m
第27题
若m个x两两不同,且m个y都相等,则输出的值为( )。
A.2n-2
B.2n
C.2m
D.2n-2m
【答案】:A
【解析】
多个相同的y,会选择最大的x,那么最后只有y和选中的那个x,a[y]和a[x]这两个不为0,所以ans=2n-2
#include <iostream>
using namespace std;
const int maxn = 10000;
int n;
int a[maxn], b[maxn];
int f(int l, int r, int depth) {
if (l > r)
return 0;
int min = maxn, mink;
for (int i=l; i<=r; ++i) {
if (min>a[i]) {
min = a[i];
mink = i;
}
}
int lres = f(l, mink-1, depth+1);
int rres = f(mink+1, r, depth+1);
return lres + rres + depth * b[mink];
}
int main() {
cin >> n;
for (int i=0; i<n; ++i)
cin >> a[i];
for (int i=0; i<n; ++i)
cin >> b[i];
cout << f(0, n-1, 1) << endl;
return 0;
}
第28题
如果a数组有重复的数字,则程序运行会发生错误。( )
A.对
B.错
【答案】:B
【解析】
没有存在运行错误的代码,常见的如数组越界、n作为除数、sqrt(-1)等
第29题
如果b数组全为0,则输出为0。( )
A.对
B.错
【答案】:A
【解析】
最后是depth * b[mink],如果b数组为0,则计算结果一定为0
第30题
当n=100时,最坏情况下,与第12行的比较运算执行的次数最接近的是:( )。
A.5000
B.600
C.6
D.100
【答案】:A
【解析】
二叉树,最深是链形,则最深是100层。100+99+98+…+1=5050
第31题
当n=100时,最好情况下,与第12行的比较运算执行的次数最接近的是:( )。
A.100
B.6
C.5000
D.600
【答案】:D
【解析】
最好情况是6层深度的二叉树,每层比较次数约100次。故为600次
第32题
当n=10时,若b数组满足,对任意0≤i<n,都有b[i]=i+1,那么输出最大为( )。
A.386
B.383
C.384
D.385
【答案】:D
【解析】
最大为1 * 1 + 2 * 2 + 3 * 3 + … + 9 * 9 + 10 * 10 = 385
第33题
当n=100时,若b数组满足,对任意0≤i<n,都有b[i]=1,那么输出最小为( )。
A.582
B.580
C.579
D.581
【答案】:B
【解析】
深度越浅越好,1 * 1 + 2 * 2 + 3 * 4 + 4 * 8 + 5 * 16 + 6 * 32 + 7 * 37 = 580
标签:真题,int,初赛,答案,ans,字符串,100,解析,CSP From: https://blog.csdn.net/guolianggsta/article/details/142298371