题目就是要在一张很大的图上匹配一个很小的区域,第一反应是建立两个图,然后暴力。但看了数据发现L太大了,直接暴力绝对超时。所以转换一下思路,因为树的数量最多只有1000,而且藏宝图的左下角一定是树,所以直接对岛上的树进行遍历,匹配从树开始的右上角区域,看(树的数量和树的位置)是否匹配藏宝图。所以我一开始用vector存储树,然后在匹配藏宝图时还是暴力,后来超时了,改用set的count找树,然后加上cincout优化加一点玄学,很自然的过了。
换用set后从1000 x 2500 x 1000 -> 1000 x 2500 x log2(1000)小于500ms限制

#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
#include<set>
using namespace std;
#pragma GCC optimize(2)int n, l, s;
// 使用set存储树的坐标(x,y)
set<pair<int, int>> trees;//
bool check(int x, int y, int a, int b){if(trees.count(make_pair(a+x, b+y))) return true;return false;
}
int main() {ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin >> n >> l >> s;// 二维动态数组vector<vector<int>> S(s+1, vector<int>(s+1,0));// tree locationfor(int i = 0; i < n; i ++){int a, b;cin >> a >>b;trees.insert(make_pair(a, b));}// treasure map, loc记录藏宝图上树木数量int loc = 0;for(int i = 0; i <= s; i ++){for(int j = 0; j <= s; ++j){cin >> S[s-i][j];if(S[s-i][j] == 1) loc ++;}}// 1000*2500*1000 -> 1000*2500*log2(1000)int ans = 0;for(auto tree: trees){int a = tree.first, b = tree.second;// 超出岛的范围,跳过if(a + s > l || b + s > l) continue;// tmp记录该树右上角藏宝图大的区域树木的数量// flag1标记是否匹配藏宝图,即使树的数量正确,也可能位置不一样,仍然是错的;也可能出现break后loc==tmp的情况int tmp = 0; bool flag1 = true;// 检查该树右上角藏宝图大的区域for(int j = 0; j <= s; j++){for(int k = 0; k <= s; k++){// 看地图上这里是否有树bool flag2 = check(a, b, j, k);// 藏宝图这里有树,但地图上可能没有if(S[j][k] == 1){if(flag2) tmp++;else{flag1 = false;break;}}// 藏宝图上没有,但地图上有else{if(flag2){flag1 = false;break;}}}}// 数量对且位置匹配if(tmp == loc && flag1) ans ++;}cout << ans;}

csp ccf 202206-2 寻宝!大冒险!(70分超时的进)相关推荐

  1. CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page 阅读本题解前,您应当了解下列知识: 线段树 教程 C++ 标准库( ...

  2. 第二十四次CSP考试第二题,速度拿70分。

    csp第二题典型特征就是很容易就能拿到70分,并且不需要考虑太多东西. 题目描述: 题解: #include<iostream> #include<map> #include& ...

  3. ccfcsp 202206-2 寻宝大冒险

    问题描述 就是这个题,输入与输出格式不再罗列,题目目的大概意思为:给定一个小的地图B,在一个大的地图A中找到B,也就是B是A的子图,求有几个这样的子图. ccf的第二题给定的限制时间和空间都很大,所以 ...

  4. 2022-6-2寻宝大冒险(不用前缀和与map,c/c++实测满分)

    总结: 离散点对应回稀疏矩阵时可以分块处理,根据限制条件筛选掉不必处理的块,缩短计算时间. 一.题目要求 题目背景 暑假要到了.可惜由于种种原因,小 P 原本的出游计划取消.失望的小 P 只能留在西西 ...

  5. ccf寻宝!大冒险!python满分(敲开心~)

    寻宝 大冒险 题目传送:http://118.190.20.162/view.page?gpid=T147 思路及代码: 核心点就是哈希. 之前刷的是70分,找不到之前的代码了,大概是建了一个很大的表 ...

  6. CCF CSP——202206-5 PS无限版(70分题解)

    问题描述 试题链接:PS无限版 70分题解 题目还是比较简单的,不至于长篇大论的(读题都累死人了),此题要求:有一系列的点(用数组保存下来),编号(1,2--,n),对编号[l,r]的点进行不同的7个 ...

  7. 2017级C语言大作业 - 奇怪的大冒险

    奇怪的大冒险 C语言作业 分享17级同学大一上学期用C语言实现的奇怪的大冒险.分步骤代码.图片音乐素材.可执行程序可从百度网盘下载: 链接:https://pan.baidu.com/s/1nR-Sa ...

  8. ccf csp寻宝!大冒险!(C语言)

    ccf csp寻宝!大冒险! 题目背景 暑假要到了.可惜由于种种原因,小 P 原本的出游计划取消.失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期--直到-- 某天,小 P 获得了一张神秘的藏 ...

  9. CCF CSP认证202206-02 寻宝!大冒险!C++题解

    题目: 分析 通俗点说,我们需要解决的问题,就是计算小地图(藏宝图)能正好对上大地图(绿化图)的次数,需要保证两个条件:1)小地图必须包含在大地图中,2)0和1必须完全对应 70分解法:暴力搜索大地图 ...

  10. CSP 寻宝!大冒险! C++

    CSP 寻宝!大冒险! C++ 思路:遍历绿化图的每个树,先判断藏宝图里树的数量和当前树的右上边长为s的正方形的树的数量是否一致,如果一致,再循环遍历判断是否相等. #include<bits/ ...

最新文章

  1. ZOJ 3829 Known Notation(贪心)题解
  2. GO语言eclipse开发环境搭建
  3. redis实现购物车
  4. c++异常处理的基本思想
  5. pythondistutils安装_安装msi后的python distutils
  6. 不愿意和别人打交道_如果你的交际能力很差,不喜欢与人打交道,这3种职业最适合你...
  7. 局域网远程访问时显示密码过期
  8. java 分布式 重复提交_Java接口防重复提交
  9. SecureCRT下载和设置
  10. python 中获取数据etree.HTML打印问题
  11. postman接口测试七
  12. 图像操作(反差,混合,调整图像亮度与对比度,绘制文字)
  13. CertPathValidatorException:validity check failed
  14. android短信接收处理和发送
  15. 解决android手机EditText设置光标颜色,android:textCursorDrawable=@drawable/corner_cursor 华为手机无效果的问题
  16. 安装ubuntu 创建分区_安装Ubuntu后如何创建单独的主分区
  17. 计算机网络实验报告:【验证性实验】
  18. vscode提示:“An SSH installation couldn‘t be found”
  19. 基于SSH开发校园失物招领网
  20. 正则表达式与JSON

热门文章

  1. typora 下载 安装教程
  2. android系统壁纸下载,提前用上Android 12系统 官方高清壁纸下载
  3. 2018阿里笔试题一道
  4. 盘点国外名企的管理奇招
  5. php下载xlsx到本地,Laravel 5.8 实现Excel 下载(将信息数据导出成Excel下载到本地)...
  6. 昆仑通态复制的程序可以用吗_昆仑通态MCGS_G系列触摸屏MQTT数据连接发布
  7. Android 常用炫酷控件(开源项目)git地址汇总
  8. VC维(Vapnik–Chervonenkis dimension)
  9. 整合营销中广告投放策略,为何需要选择公关广告?
  10. 信号与系统实验一 信号在MATLAB中的表示