- 杜昊阳 的博客
CSP-J 02
- @ 2025-8-5 15:26:42
参考答案
B D C D B
D D B A C
D C D B C
A B B B C
A B B B B
D C B B A
B B D A D
D D D D A
B B C
单选题
1.关于C++语言描述错误的是?
[A]C++是面向对象编程的语言
[B]C++源代码在Linux环境中可以直接执行
[C]C++程序可以直接导入C语言的常用头文件且不会出现错误
[D]导入对应头文件后可以使用C++程序调用windows系统命令
解析过程
- [A] C++是面向对象编程语言,具有类、继承、多态等面向对象特性,该描述正确。
- [B] C++源代码需要先通过编译器(如g++)编译生成可执行文件,之后才能在Linux环境中运行,不能直接执行,该描述错误。
- [C] C++兼容C语言,其标准库包含C语言的常用头文件(如stdio.h、stdlib.h等),直接导入后可正常使用,不会出现错误,该描述正确。
- [D] 在Windows环境下,通过导入特定头文件(如windows.h),C++程序可以调用Windows系统API函数来执行系统命令,该描述正确。
2.二进制数10101110 和 11110110 做逻辑异或运算的结果是( )。
[A]11111111
[B]10100110
[C]01011000
[D]01011010
解析过程
异或运算规则是相同则0,不同则1。
因此过程如下:
3.一个8位二进制数,其原码为10010101,则其补码是( )
[A]10010101
[B]01101010
[C]11101011
[D]11101010
解析过程
原:二进制+符号位1
反:除符号位反转(0,1互换)
补:反码+1(进位)
程序题
1.
#include<iostream>
using namespace std;
int count=0, weight[1001], a[7];
int main() {
for(int i=1;i<=6;i++){
cin>>a[i];
}
for (int x1=0; x1<=a[1]; x1++)
for (int x2=0; x2<=a[2]; x2++)
for (int x3=0; x3<=a[3]; x3++)
for (int x4=0; x4<=a[4]; x4++)
for (int x5=0; x5<=a[5]; x5++)
for (int x6=0; x6<a[6]+1; x6++)
{
int w=1*x1+2*x2+5*x3+10*x4+20*x5+50*x6;
weight[w]++;
}
for (int i=0; i<=1000; i++)
if (weight[i]>0) count++;
cout<<count;
return 0;
}
- 任意满足要求的合法输入,程序运行中均不会发生运行错误。(若会发生运行错误,则认为之后问题描述的程序是修正后的数据范围)。
[A]√
[B]×
对于“任意合法输入程序运行无错误”这一说法,由于weight数组大小为1001(索引0-1000),只要输入的a[1]到a[6]使得计算出的w不超过1000,就不会越界。题目已说明“任意合法输入均无运行错误”(但是时我没看懂...),因此该说法正确,答案为A。- 若程序执行完毕后,输出结果至少为1。
[A]√
[B]×
程序逻辑中,六重循环从x1(对应a[1])开始嵌套执行。若任意a[i]=0(如a[1]=0),则该层循环条件x_i<0不成立,循环体完全不会执行,导致weight数组无任何赋值(全为0),最终count=0。
- 当程序输入为”0 0 0 1 1 1”时,程序输出为( )。
[A]6
[B]7
[C]8
[D]9
2.
#include<iostream>
using namespace std;
int n;
char s[4096];
int fun(int start, int length)
{
if(length == 0){
cout << (s[start]=='0'?'A':'B');
return s[start] - '0';
}
int p = 1<<(length-1);
int l = fun(start,length-1);
int r = fun(start+p,length-1);
if( l==r && l!=2 )
{
cout << (l==0?'A':'B');
return l;
}
else{
cout<<'C';
return 2;
}
}
int main()
{
cin >> n;
cin >> s;
fun (0, n);
return 0;
}
- 存在某种合法输入,使得程序输出为连续的多个ABC依次循环( )
[A]√
[B]×
递归函数中输出“C”需左右子树返回值不同,而“A/B”需返回值相同或为叶节点输出,循环序列“ABC”需固定模式交替,但函数输出受输入和递归结构约束,无法形成规律性“ABC”重复。- 存在某种合法输入,使得程序输出全部为C字符( )
[A]√
[B]×
叶节点总是输出“A”或“B”,无法输出“C”;非叶节点输出“C”需左右子树返回值不同,但叶节点输出必然包含“A/B”,导致全部输出为“C”不可行。- 当n的值为3时,输出字符A的个数最多为( )
[A]3
[B]6
[C]8
[D]15
填空题
题目描述
选择不相交区间 数轴上有n个开区间(ai,bi)。选择尽量多的区间,使这些区间两两没有公共点。 给出n个区间,第i个区间的左右端点是[ai,bi]。现在要在这些区间中选出若干个,使这些区间两两没有公共点。保证答案存在,求可选区间个数的最大值。 注:认为区间[3,5][5,9]没有公共交点,可以同时选择,认为区间[3,6][5,9]有公共交点,不可以同时选择。 输入第一行包含一个整数n,接下来 n 行,每行两个整数ai,bi。(1<=n<=5000,1<=ai,bi<=10^9) 提示:使用贪心法解决这个问题。先用冒泡排序的思路进行结构体数组排序,然后依次抉择每个区间。 试补全程序。
#include <iostream>
using namespace std;
const int MAXN = 5000;
int n;
struct segment {
int a, b;
}A[MAXN];
void sort() // 排序
{
for (int i = 0; i < n; i++)
for (int j = i+1; j <= ①; j++)
if ( ② )
{
swap(A[i],A[j]); //交换两个变量
}
}
int main(){
cin >> n;
for (int i = 0; i < n; i++)
cin >> A[i].a >> A[i].b;
sort();
int ans =1, r = ③;
for (int i = 1; i < n; i++)
{
if(a[i].a>=r){
ans++;
r = A[i].b;
}
}
cout << ans << endl;
return 0;
}
①:n-1
冒泡排序外层循环i从0到n-1,内层循环j从i+1到n-1,确保所有元素两两比较。②:A[i].b>A[j].b
按区间右端点b升序排序,若b相同则按左端点a升序,确保贪心算法正确性。③:A[0].b
这是贪心算法的初始化,ans初始为1表示至少选择第一个区间,r初始化为第一个区间的右端点,用于后续比较。