CSP真题练习

Posted 蛋黄液

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSP真题练习相关的知识,希望对你有一定的参考价值。

202209

1.如此编码


#include<iostream>
using namespace std;
int n;
int a[30] =  0 ;//选项个数
long long m;//神秘数字
int b[30] =  0 ;
long long c[30] =  0 ;

int main() 
	//首先输入
	cin >> n >> m;
	c[0] = 1;//初始化
	for (int i = 1; i <= n; i++) 
		cin >> a[i];//选项个数
		c[i] = c[i - 1] * a[i];//初始化,前缀积
	
	long long num = 0;//用来减去已经计算出来的数字
	for (int j = 1; j <= n; j++) 
		b[j] = (m % c[j] - num) / c[j - 1];
		num += b[j] * c[j - 1];
	

	for (int k = 1; k <= n; k++) 
		cout << b[k] << ' ';
	
	

	return 0;

2.何以包邮

反向使用01背包,动态规划

参考这篇文章

//反向01背包
#include<iostream>
#include<algorithm>
using namespace std;
#define N 300050
bool cmp(int a, int b) 
	return a < b;

int max(int a, int b) 
	if (a > b) 
		return a;
	
	else 
		return b;
	


int main() 
	int n;//图书数量
	int x;//包邮条件
	int a[50];//价格数组
	int min_num = 0;//输出的最小图书价格,一定要大于等于x
	int sum = 0;
	cin >> n >> x;
	//双指针不可以,因为书本的数量不确定
	//度量标准,必须要 m >= x
	//动态规划 dp[i]存放的是 M-x 的最大价格,保证大于x
	//寻找 总价M-x,查找最大值
	int dp[N] =  0 ;
	for (int i = 1; i <= n; i++) 
		cin >> a[i];
		sum += a[i];
		if (a[i] == x) 
			min_num = x;
		
	
	
	int money = sum - x;//其实就是求用money的钱,最多能买多少本书。

	//最后最大的dp[i] = max(dp[i],dp[i-a[i]+a[i]);
	//最大值可能是要从上一次取得,但是也有可能是 dp[j-a[i]]+a[i];
	// 因为是01问题,所以减去的是当前的重量。
	//20 90 60 60 sum = 230,money = 130,计算用130最多能买多少本书,其实就是130的书包容量最多能容纳多少。

	for (int i = 1; i <= n; i++) 
		for (int j = money; j >= a[i]; j--) //j就是剩下的钱,j>a[i]是要保证它能买得起这本书
			// 根据01背包动态规划来思考
			
			dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
		
	
	
	cout << sum-dp[money] << endl;

	return 0;

3.防疫大数据


样例输入

9
1 4 1
0 1 1
-1 1 1
-1 2 1
0 2 2
0 3
0 3 1
1 2 2
1 3 2
0 0
0 0
0 0
0 0
0 0
0 1
5 4 1
1 0 1

样例输出

0 1
1 1 3
2 1 3
3 1 3
4 1 3
5 1 3
6 1 3
7
8

202206

1.归一化处理


#include<iostream>
#include<cmath>
using namespace std;
int main() 
	int n,array[1000];
	// 输入 
	cin>>n;
	for(int i=0;i<n;i++) 
		cin>>array[i];
	
	// 逐个数据遍历求和 
	double sum = 0; //此处若将sum设置为int类型则结果将不满足精度要求 
	for(int i=0;i<n;i++) 
		sum += array[i];
	
	double average = sum / n; //计算平均值 
	//计算方差 
	double variance = 0;
	for(int i=0;i<n;i++) 
		variance += (array[i] - average) * (array[i] - average);
	
	variance = sqrt(variance / n);
	// 遍历数据并进行归一化计算 
	for(int i=0;i<n;i++) 
		cout<<(array[i]-average) / variance<<endl;
	
	return 0;


以上是关于CSP真题练习的主要内容,如果未能解决你的问题,请参考以下文章

CCF CSP 202109赛题练习

CCF CSP-2022-01 赛题练习

CCF-CSP真题《202212-1 现值计算》思路+python,c++,c满分题解

新CCF-CSP认证历年真题解

CSP2020-J1-真题解析-阅读程序

算法题CCF CSP第二题练习(更新中)