CCF-CSP真题202206-归一化处理/寻宝大冒险
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF-CSP真题202206-归一化处理/寻宝大冒险相关的知识,希望对你有一定的参考价值。
CCF-CSP真题202206
归一化处理
数学题:直接计算平均值、方差、按公式计算即可!
7
-4 293 0 -22 12 654 1000
-0.7485510379073613
0.04504284674812264
-0.7378629047806881
-0.7966476369773906
-0.7057985054006686
1.0096468614303775
1.9341703768876082
#include<bits/stdc++.h>
using namespace std;
const int N = 1000;
int n;
float q[N], data[N];
float sum, avg, d, res;
int main()
cin >> n;
for (int i = 0; i < n; i++)
cin >> q[i];
sum += q[i];
avg = sum / n;
for (int i = 0; i < n; i++)
d += pow(q[i] - avg, 2);
d = sqrt(d / n);
for (int i = 0; i < n; i++)
res = (q[i] - avg) / d;
printf("%f\\n", res);
https://blog.csdn.net/weixin_53919192/article/details/125422088?spm=1001.2014.3001.5502
寻宝大冒险
解题思路:
在大地图寻找小地图左下角匹配次数。
由于大地图的数据范围很大,所以不能用二维数组进行存储整张地图所以将大地图上给出的n个1的坐标用vector<pair<int, int>>
进行存储(用二维数组也可以)然后将小地图也进行存储
题目中给出了两个关键的条件:
- 小地图的左下角一定是1,并且查找有多少个坐标符合这个1
所以我们的出发点就可以是枚举大地图上的每一个1作为小地图的左下角,再遍历小地图,看其他点是否匹配,若匹配,则答案加1 - 题目中给出了小地图的坐标排布
最先输入的是B[S][0]⋯B[S][S] 一行,B[0][0]⋯B[0][S]
一行最后输入。乍一看以为是数学坐标系,但其实并不是,只是数组坐标系的行逆序罢了(输入时需要注意这点)
暴力:遍历绿化图的每个树,先判断藏宝图里树的数量和当前树的右上边长为s的正方形的树的数量是否一致,如果一致,再循环遍历判断是否相等。
优化:只存储1的点坐标,使用
pair<int, int>
,从该点进行遍历小地图,如果符合便res_num++
这题如果用二维矩阵肯定会超标,因为样例保证,所以考虑用点集来处理。
- 读入所有的树的位置,每个位置用一个pair来记录
- 记录每个可能的左下角——其实也就是树的位置——对应的藏宝图范围覆盖了多少棵树
- 读入藏宝图中树的位置和个数
- 对于每颗绿化图中的树,检查树的个数与藏宝图是否一致,检查树的位置与藏宝图是否一致,二者均符合则答案加一
- 输出答案
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define rep(i,a,n) for (int i = a; i < n; i ++ )
#define repn(i,a,n) for (int i = a; i <= n; i ++ )
#define pb push_back
#define ios ios::sync_with_stdio(false); cin.tie(0);cout.tie(0);
typedef long long ll;
typedef pair<int,int> PII;
ll gcd(ll a,ll b) return b ? gcd(b,a % b) : a;
const int mod = 1e9+7;
int n, l, s;
map<PII, int> mp;
map<PII, int> rp;
vector<PII> qwe;//因为csp不支持for (auto [q, v] : mp) 会报编译出错,所以用vector存一下
//暴力枚举每一个树, 最差最差1000 * 51 * 51,能过
int main()
IOS;
cin >> n >> l >> s;
for (int i = 1; i <= n; i ++ )
int a, b;
cin >> a >> b;
mp[a, b] = 1; // 统计入map集合中
qwe.push_back(a, b); // 存入vector中
for (int i = s; i >= 0; i --)
for (int j = 0; j <= s; j ++ )
int x;
cin >> x;
if (x == 1) rp[i, j] = 1; // 宝藏图
int cnt = 0;
for (int r = 0; r < qwe.size(); r ++ )
int dx = qwe[r].x, dy = qwe[r].y; // 找到种树的坐标
bool fg = true;
// 遍历宝藏图[s,s]
for (int i = 0; i <= s; i ++ )
for (int j = 0; j <= s; j ++ )
if(mp[dx + i, dy + j] != rp[i, j] || dx + i > l || dy + j > l) // 判断左下角和是否不满足小地图,剪枝
fg = false;
break;
if(!fg) break;
if(fg)
cnt ++;
cout << cnt << endl;
return 0;
学习竞赛大佬的代码习惯风格!
代码2:
#include <iostream>
using namespace std;
const int N = 51, M=1010;
int n, L, S, ans;
bool b[N][N];
pair<int, int> location[M]; // 定义坐标数组,存储1
// 判断坐标是否在大地图中
int find(int a, int b)
for (int i = 0; i < n; i++)
if (a == location[i].first && b == location[i].second)
return 1;
return 0;
int main()
cin >> n >> L >> S;
for (int i = 0;i < n; i++)
cin >> location[i].first >> location[i].second;
for (int i = S; i >= 0; i--)
for (int j = 0; j <= S; j++)
cin >> b[i][j];
for (int i = 0; i < n; i++)
if (location[i].first > L-S || location[i].second > L-S) continue;
bool flag = true;
for (int x = 0; x <= S; x++)
// 遍历子图
for (int y = 0; y <= S; y++)
if (x == 0 && y==0)
continue;
int findx = find(location[i].first+x, location[i].second+y); // 返回0/1
if (findx != b[x][y])
flag = false;
break;
if (!flag)
break;
if (flag)
ans++;
cout << ans << endl;
return 0;
Rederence
加油!
感谢!
努力!
以上是关于CCF-CSP真题202206-归一化处理/寻宝大冒险的主要内容,如果未能解决你的问题,请参考以下文章