2020年CCF非专业级别软件能力认证第一轮CSP_S/提高级
2020
第一轮
2023-09-02 19:50:12
52次
一、单选题
二、多选题
三、判断题
四、组合题
(最优子序列)取m=6,给出长度为n的整数序列a1,a2,……an(0 ≤ ai<2m)。对于一个二进制数x,定义其分值w(x)为x + popcnt(x),其中 popcnt(x)表示x二进制表示中1的个数。对于一个子序列b1,b2,…,bk,定 义其子序列分值S为w(b1㊉b2)+w(b2㊉b3)+w(b3㊉b4)+……+w(bk-1㊉bk)。其中㊉表示按位异或。对于空子序列,规定其子序列分值为0。求一个子序列使得其子序列分值最大,输出这个最大值。
输入第一行包含一个整数n(1 ≤ n ≤ 40000).接下来一行包含n个整数 a1,a2,……,an。
提示:考虑优化朴素的动态规划算法,将前
位和后
位分开计算。
Max[x][y]表示当前的子序列下一个位置的高8位是X、最后一个位置的 低8位是y时的最大价值。
试补全程序。

③处应填()
| A. -INF |
B. Max[y] [x] |
| C. 0 |
D. Max[x][yJ |
②处应填()
| A. (a & MS) « B |
B. a>>B |
| C. a&(1<<B) |
D. a&(MS<<B) |
⑤处应填()
| A. to_max(Max[y][z],v + w(a ^(z << B))) |
B. to_max(Max[z][y],v + w((x ^ z) << B)) |
| C. to_max(Max[zJ[y],v + w(a ^ (z << B))) |
D. to_max(Max[x][z],v + w(y ^ z)) |
④处应填()
| A. Max[x] [z]+w(y^z) |
B. Max[x][z] + w(a ^ z) |
| C. Max[x] [z]+w(x^(z<<B)) |
D. Max[x][z] + w(x ^ z) |
①处应填()
| A. X >>= 1 |
B. X ^=X & (x ^ (x + 1)) |
| C. X -= X | -X |
D. X ^= X & (X ^ (x - 1)) |
【知识点】 CCF非专业级别软件能力认证CSP-S/提高级

假设输入的n, k和d[i]都是不超过10000的正整数,且k不超过n,并 假设rand()函数产生的是均匀的随机数,完成下面的判断题和单选题:
(1).第9行的“x”的数值范围是L+1到R.即[L+l, R]。()
| A.正确 | B.错误 |
(2.5分)若输入的d[i]为i,此程序①平均的时间复杂度和②最坏 情况下的时间复杂度分别是()
| A. 0(n), 0(n^2) |
B. 0(n), 0(n log n) |
| C. 0(n log n), 0(n^2) |
D. 0(n log n), 0(n log n) |
(2.5分)当输入的d[i]是严格单调递增序列时,第17行的 “swap”平均执行次数是()。
| A. 0(n log n) |
B. 0(n) |
| C. 0(log n) |
D. 0(n^2) |
将第19行的“d[a]”改为“d[b]“,程序不会发生运行错误。()
| A.正确 | B.错误 |
(2.5分)若输入的d[i]都为同一个数,此程序平均的时间复杂度是()
| A. 0(n) |
B. 0(log n) |
| C. 0(n log n) |
D. 0(n^2) |
(2.5分)当输入的d[i]是严格单调递减序列时,第17行的“swap” 平均执行次数是()。
| A. 0(n^2) |
B. 0(n) |
| C. 0(n log n) |
D. 0(log n) |
【知识点】 CCF非专业级别软件能力认证CSP-S/提高级

01 #include <iostream>
02 #include <queue>
03 using namespace std;
04
05 const int max1 = 2000000000;
06
07 class Map (
08 struct item {
09 string key; int value;
10} d[max1];
11int cnt;
12public:
13int find(string x) {
14for (int i = 0; i < cnt; ++i)
15if (d[i].key == x)
16return d[i].value;
17return -1;
18}
19static int end() { return -1; }
20void insert(string k, int v) {
21d[cnt].key = k; d[cnt++].value = v;
22}
23} s[2];
24
25class Queue {
26string q[max1];
27int head, tail;
28public:
29void pop() { ++head; }
30string front() { return q[head + 1]; }
31bool empty() { return head == tail; }
32void push(string x) { q[++tail] = x; }
33} q[2];
34
35string st0,stl;
36int m;
37
38string LtoR(string s, int L, int R) {
39string t = s;
40char tmp = t[L];
41for (int i = L; i < R; ++i)
42t[i] = t[i + 1];
43t[R] = tmp;
44return t;
45}
46
47string RtoL(string s, int L,int R) {
48string t = s;
49char tmp = t[R];
50for (int i = R; i > L; --i)
51t[i] = t[i - 1];
52t[L] = tmp;
53return t;
54}
55
56bool check(string st, int p,int step) {
57if (s[p].find(st) != s[p].end())
58return false;
59++step;
60if (s[p ^ 1].find(st) == s[p].end()) {
61s[p].insert(st, step);
62q[p].push(st);
63return false;
64}
65cout << s[p ^ 1].find(st) + step << end1;
66return true;
67}
68
69int main() {
70cin >> st0 >> stl;
71int len = st0.length();
72if (len != stl.length()) {
73cout << -1 << end1;
74return 0;
75}
76if (st0 == st1) {
77cout << 0 << end1;
78return 0;
79}
80cin >> m;
81s[0].insert(st0, 0); s[1].insert(st1, 0);
82q[0].push(st0); q[1].push(st1);
83for (int p = 0;
84!(q[0].empty() && q[1].empty());
85p ^=1) {
86string st - q[p].front(); q[p].pop();
87int step = s[p].find(st);
88if ((p == 0 &&
89(check(LtoR(st,m, len - 1), p, step) ||
90check(RtoL(st, 0, m), p, step)))
91||
92(p == 1 &&
93(check(LtoR(st,0, m), p, step) ||
94check(RtoL(st, m, len - 1), p, step))))
95return 0;
96}
97cout << -1 << end1;
98return 0;
99}
(1).(4分)若两个字符串的长度均为n, 且0<m<n-1,且两个字符串的构 成相同(即任何一个字符在两个字符串中出现的次数均相同),则下列 说法正确的是()。提示:考虑输入与输出有多少对字符前后顺序不 一样。
| A. 若n、m均为奇数,则输出可能小于0 |
B. 若n、m均为偶数,则输出可能小于 0 |
| C. 若n为奇数、m为偶数,则输出可能小于0 |
D. 若n为偶数、m为奇敎.则输出可能小于0 |
若两个字符串的长度均为n,则最坏情况下,此程序的时间复杂度为 0(n!)。 ()
| A.正确 | B.错误 |
(4分)已知当输入为“0123\n3210\n1”时输出为4,当输入为 “012345\n543210\n1”时输出为14,当输入为 “01234567\n76543210\n1”时输出为28,则当输入为 “0123456789ab\nba9876543210\n1” 输出为()。其中“\n”为换行符。
| A. 56 |
B. 84 |
| C. 102 |
D. 68 |
(2.5分)若输入的第一个字符串长度由100个不同的字符构成,第二 个字符串是第一个字符串的倒序,输入的m为0,则输岀为()。
| A. 49 |
B. 50 |
| C. 100 |
D. -1 |
若输入的两个字符串长度均为101时,则m=0时的输出, m=10O时的 输出是一样的。()
| A.正确 | B.错误 |
输出可能为0 ()
| A.正确 | B.错误 |
【知识点】 CCF非专业级别软件能力认证CSP-S/提高级
(分数背包)小S有n块蛋糕,编号从1到n第i块蛋糕的价值是wi, 体积是vi。他有一个大小为B的盒子来装这些蛋糕,也就是说装入盒子的 蛋糕的体积总和不能超过B。
他打算选择一些蛋糕装入盒子,他希望盒子里装的蛋糕的价值之和尽量 大。
为了使盒子里的蛋糕价值之和更大,他可以任意切割蛋糕。具体来说,他 可以选择一个a (0<a<l),并将一块价值是w,体枳为v的蛋糕切割成两 块.其中一块的价值是a・w,体枳是a・v,另一块的价值是(l-a)・w.体 积是(l-a)v。他可以重复无限次切割操作。
现要求编程输出最大可能的价值,以分数的形式输出。
比如n=3, B=8,三块蛋糕的价值分别是4、4、2,体枳分别是5、3、2。 那么最优的方案就是将休积为5的蛋糕切成两份,一份体积是3,价值是 2.4,另一份体积是2,价值是1.6,然后把休积是3的那部分和后两块蛋 糕打包进盒子。最优的价值之和是8.4,故程序输出42/5。
输入的数据范围为:1≤n≤1000,1≤B≤10^5;1≤wi,vi≤100。
提示:将所有的蛋糕按照性价比wi/vi从大到小排序后进行贪心选择。
试补全程序。
#include <cstdio>
using namespace std;
const int maxn = 1005;
int n,B, w[maxn], v[maxn];
int gcd(int u, int v) {
if(v == 0)
return u;
return gcd(v, u % v);
}
void print(int w, int v) {
int d = gcd(w> v);
w = w / d;
v = v / d;
if(v == 1)
printf(”%d\n”, w);
else
printf(”%d/%d\n”, w, v);
}
void swap(int &x, int &y) {
int t = x; x = y; y = t;
}
int main() {
scanf("%d %d", &n, &B);
for(int i = 1; i <= n; i ++) {
scanf(”%d%d,&w[i], &v[i]);
}
for(int i = 1; i < n; i ++)
for(int j = 1; j < n; j ++)
if(①){
swap(w[j], w[j + 1]);
swap(v[j],v[j + 1]);
}
int curV, curW;
if(②) {
③
} else {
print(B * w[1], v[1]);
return 0;
}
for(int i = 2; i <= n; i ++)
if(curV + v[i] <= B) {
curV += v[i];
curW += w[i];
} else {
print(④);
return 0;
}
print (⑤);
return 0;
}
③处应填()
| A. print(v[1]w[1]); return 0; |
B. curV = 0; curW = 0; |
| C. print(w[1] v[1]); return 0; |
D. curV = v[1]; curW = w[1]; |
⑤处应填()
| A. curW, curV |
B. curW,1 |
| C. curV, curW |
D. curV,1 |
④处应填()
| A. curW * v[i] + curV * w[i], v[i] |
B. (curW - w[i]) * v[i] + (B - curV) * w[i], v[i] |
| C. curW + v[i], w[i] |
D. curW * v[i] * (B - curV) * w[i], v[i] |
②处应填()
| A. w[1] <= B |
B. v[1] <= B |
| C. w[1] >= B |
D. v[1] >= B |
①处应填()
| A. W[j] / v[j] < w[j+1]/v[j+1] |
B. W[j] / v[j]> w[j+1]/v[j+1] |
| C. v[j] * w[j+1]< v[j+1]*w[j] |
D. w[j] * v[j+1]< w[j+1]*v[j] |
【知识点】 CCF非专业级别软件能力认证CSP-S/提高级

假设输入的n和d[i]都是不超过10000的正整数,完成下面的判断题和单 选题:
(1).n必须小于1000,否则程序可能会发生运行错误。()
| A.正确 | B.错误 |
输出一定大于等于0。()
| A.正确 | B.错误 |
将第14行的“d[i] < d[j]"改为wd[i] != d[j]”,程序输出不会改 变。()
| A.正确 | B.错误 |
若输入n 100.且输出为127.则输入的d[i]中不可能有()。
| A. 127 |
B. 126 |
| C. 128 |
D. 125 |
若输出的数大于0,则下面说法正确的是()。
| A. 若输出为偶数,则输入的d[i],中最多有两个偶数 |
B. 若输出为奇数,则输入的d[i]中至少有两个奇数 |
| C. 若输出为偶数,则输入的d [ i ]中至少有两个偶数 |
D. 若输出为奇数,则输入的d[i]中最多有两个奇数 |
若将第13行的“j =0”改为“j = i +1” 程序输出可能会改变。()
| A.正确 | B.错误 |
【知识点】 CCF非专业级别软件能力认证CSP-S/提高级

