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作为小地图的左下角,再遍历小地图,看其他点是否匹配,若匹配,则答案加1
  2. 题目中给出了小地图的坐标排布
    最先输入的是 B[S][0]⋯B[S][S] 一行,B[0][0]⋯B[0][S] 一行最后输入。乍一看以为是数学坐标系,但其实并不是,只是数组坐标系的行逆序罢了(输入时需要注意这点)
  • 暴力:遍历绿化图的每个树,先判断藏宝图里树的数量和当前树的右上边长为s的正方形的树的数量是否一致,如果一致,再循环遍历判断是否相等。

  • 优化:只存储1的点坐标,使用pair<int, int>,从该点进行遍历小地图,如果符合便res_num++

这题如果用二维矩阵肯定会超标,因为样例保证,所以考虑用点集来处理。

  1. 读入所有的树的位置,每个位置用一个pair来记录
  2. 记录每个可能的左下角——其实也就是树的位置——对应的藏宝图范围覆盖了多少棵树
  3. 读入藏宝图中树的位置和个数
  4. 对于每颗绿化图中的树,检查树的个数与藏宝图是否一致,检查树的位置与藏宝图是否一致,二者均符合则答案加一
  5. 输出答案
#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

Link

Link

加油!

感谢!

努力!

以上是关于CCF-CSP真题202206-归一化处理/寻宝大冒险的主要内容,如果未能解决你的问题,请参考以下文章

处理数据时不进行归一化会有啥影响?归一化的作用是啥

matlab中怎样将矩阵归一化处理?

spss实现中心化处理、标准化处理和归一化处理

如何用matlab对以下函数进行归一化处理

在matlab中怎么做数据归一化处理?

matlab中啥叫归一化坐标