- 高瑞 的博客
CSP-J模拟卷(二)
- @ 2025-8-5 15:18:21
T10
题意:在一个具有 n 个顶点的无向图中,要连通全部顶点至少需要 (C) 条边。
A,n
B,n + 1
C,n - 1
D,n - 2
错误原因:以为只有连成一个圈才算,但是可以在一个圈的基础上去掉一条边
T14
题意:关于C++语言描述错误的是(B)
A,C++是面向对象的编程语言
B,C++源代码能在Linux环境中直接执行
C,在C++程序中能直接导入C语言的常用头文件,不会报错
D,导入头文件后,C++能直接调用Windows系统命令
思路:C++源代码能在Linux环境中需要先编译,再执行
T15
题意:有2N个数,需要求出最大值和最小值,你需要的最少比较次数是(C)。
A,2N + 1
B,2N + 2
C,3N - 2
D,4N - 3
思路:可以用for循环遍历,i每次+= 2,先比较i, i + 1,再让大的和max比,小的和min比
阅读程序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;
}
这个代码先是让桶数组存一些数,再数有几个桶里面有数
阅读程序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;
}
这段代码用了递归,把一个字符串改成了A,B,C的形式
阅读程序3
#include<bits/stdc++.h>
using namespace std;
int n, m, ans, p[101], e[101];
int pow1(int x, int w) {
int res = 1;
for (int i = 1; i <= w; i++) {
res = res * x;
}
return res;
}
int main() {
cin >> n;
int i = 2;
while (n != 1) {
if (n % i == 0) {
m++;
p[m] = i;
e[m] = 0;
while (n % i == 0) {
e[m]++;
n = n / i;
}
}
i++;
}
ans = 1;
for (int i = 1; i <= m; i ++) {
ans = ans * (p[i] - 1) * pow1(p[i], e[i] - 1);
}
cout << ans << endl;
}
这段代码是先把n分解质因数,再算出一个ans
完善程序1
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, num, mid, t;
ll a[10000001], b[1000001];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int i = n;
while (i > 1) {
if (a[i] > a[i - 1]){
num++;
b[num] = a[i];
}
else{
num++;
b[num] = a[i];
num++;
b[num] = a[i - 1];
mid = i - 2;
break;
}
i--;
}
if (i == 1) cout << "No NextPermutation";
else{
for (i = 1; i <= num - 1; i++)
if (④){
t = b[i];
b[i] = b[num];
b[num] = t;
break;
}
for (i = 1; i <= mid; i++)cout << a[i] << " ";
cout << b[num] << " ";
for (i = 1; i <= num - 1; i++) cout << b[i] << " ";
cout << endl;
}
}
输入一个正整数n以及n个不同的正整数。这个数可以理解为n的一种排列,假设(1,2,3,4,…,n)是第1个排列,(n,n−1,…,1)是最后一个排列,根据这n个数组成的排列,输出下一个排列
完善程序2
#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 <= n - i; j++)
if (A[i].a > A[j].a)
{
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 = n;
for (int i = 1; i < n; i++)
{
if(A[i].a >= r){
ans = ans + 1;
r = A[i].b;
}
}
cout << ans << endl;
return 0;
}
数轴上有n个开区间(a[i],b[i])(a[i],b[i])。选择尽量多的区间,使这些区间两两没有公共点。 给出 n 个区间,第i个区间的左右端点是a[i],b[i],a[i],b[i]。现在要在这些区间中选出若干个,使这些区间两两没有公共点。保证答案存在,求可选区间个数的最大值。 注:认为区间[3,5][5,9]没有公共交点,可以同时选择,认为区间[3,6][5,9]有公共交点,不可以同时选择。 输入第一行包含一个整数n,接下来 n 行,每行两个整数a[i],b[i],a[i],b[i]。使用贪心法解决这个问题。先用冒泡排序的思路进行结构体数组排序,然后依次抉择每个区间。