归一化处理
问题
对给出的数据进行归一化处理,处理后。平均值为0,方差为1
思路
按照题目的公式计算即可。需要平均值,方差,以及归一处理,后两个操作都用到了数据 - 均值,就把这个值存起来了,不存应该也可以。
最终结果为浮点数,为了精度考虑,最好一开始就是double。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
double ave, D;
double sum = 0;
double temp;
vector<double> a(n);
for(int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
}
ave = sum / n;
sum = 0;
vector<double> b(n);
for(int i = 0; i < n; i++) {
b[i] = a[i] - ave;
sum += pow(b[i],2);
}
D = sum / n;
double k = pow(D,-0.5);
for(int i = 0; i < n; i++) {
cout << b[i] * k << endl;
}
return 0;
}
寻宝!大冒险!
问题
两个图,一个是绿化图A,[L+1][L+1] 的,记录了n棵树,但输入只提供了n棵树的坐标。藏宝图B,[S+1][S+1],矩阵,树为1,其余为0,B的左下角必有一棵树。问A中有多少棵树和B左下角对齐后,能和B一 一对应,就是A中藏有宝藏的树的数量。
优秀思路
没想出来,又去看B站的老师视频
202206(第26次)CCF CSP真题202206-1,2讲解
所有的数据S<= 50,全部数据L <=10e9,L好大,所以我们从S出发考虑,n<=1000也还可以。
首先存储n棵树,以及B的地图,然后遍历n棵树的坐标
- 分析左下角坐标对齐时,能否有一个B的大小的子矩阵
- 可以的话,将小矩阵摘出来:再次遍历n棵树,判断哪些树在这个小矩阵中,记录下来
- 遍历对比两个矩阵,是否完全一致
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, L, S;
cin >> n >> L >> S;
vector<vector<int> > A(n, vector<int>(2));
vector<vector<int> > B(S + 1, vector<int>(S+1));
for(int i = 0; i < n; i++) {
cin >> A[i][0] >> A[i][1];
}
for(int i = S; i >= 0; i--) {
for(int j = 0; j <= S; j++) {
cin >> B[i][j];
}
}
int x, y, ans = 0;
for(int i = 0; i < n; i++) {
x = A[i][0];
y = A[i][1];
vector<vector<int> > C(S + 1, vector<int>(S+1, 0));//初始化
//判断能有一个S+1大小的子矩阵
if(x <= L-S && y <= L-S) {
//小矩阵摘出来
for(int j = 0; j < n; j++) {
//边界条件!!!
if(A[j][0] <= (x + S) && A[j][0] >= x && A[j][1] >= y && A[j][1] <= (S + y)) {
C[A[j][0] - x][A[j][1]- y] = 1;
}
}
}
int flag = 1;
for(int k = 0; k<= S && flag; k++) {
for(int t = 0; t <=S; t++) {
if(B[k][t]!=C[k][t]) {
flag = 0;
break;
}
}
}
if(flag) {
ans++;
}
}
cout << ans << endl;
return 0;
}
get
如果不是非常麻烦的话不用想着弄到最简,稍微麻烦一些也是可以的,对于计算机来说,50*50的矩阵遍历不是什么问题。
然后就是,坐标关系弄清楚。
A中的点如果在小矩阵里面的话,坐标范围是[x,x+S] [y,y+S]