洛谷P1076 寻宝 题解 模拟
时间:2020-04-14
本文章向大家介绍洛谷P1076 寻宝 题解 模拟,主要包括洛谷P1076 寻宝 题解 模拟使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://www.luogu.com.cn/problem/P1076
解题思路:
这道题目是一道标准的模拟题。一开始我们在第 \(1\) 层的 \(p\) 号房间,然后我们要沿着逆时针方向找 \(x\) 把钥匙,然后进入上一层。
我们可以暴力模拟一下这个算法,看看在最坏情况下的的时间复杂度。
如下所述是我能够想到的最坏情况:
有 \(N = 10000\) 层,每层楼有 \(M = 100\) 个房间,每一层我都要寻找 \(x = 1,000,000\) 把钥匙,每一层只有一把钥匙。
这种情况下,我要转 \(10^6\) 圈才能收集 \(x\) 把钥匙,每一圈我遍历了 \(M=100\) 个房间,再算上层数 \(N=10^4\),总的时间复杂度达到了
\[10^6 \times 10^2 \times 10^4 = 10^{12}
\]
是会超时的。
优化:
我可以开一个 \(sum[]\) 数组,其中 \(sum[i]\) 用于记录第 \(i\) 层的房间总共有多少把钥匙。
然后,我假设我刚进入第 \(i\) 层的时候在第 \(p\) 号房间,嫔妾房间上写的号码是 \(x\),那么:
- 如果 \(x\) 不能被 \(sum[i]\) 整除,则我们只需要从 \(p\) 开始逆时针找到第 \(x \text{ mod } sum[i]\) 把钥匙就可以了(这里 \(\text{mod}\) 表示取余数);
- 否则(\(x\) 能被 \(sum[i]\) 整除),则我们只需要从 \(p\) 的前一个房间按照顺时针顺序找到第一把有钥匙的房间就可以了。
比如,我当前在第 \(i\) 层的第 \(p\) 个房间,上面写着数字 \(8\) —— 也就是说我要找到第 \(8\) 把钥匙对应的房间,同时 \(sum[i]=3\),所以我饶了一圈之后回到第 \(p\) 个房间,我还剩下 \(8-3=5\) 把钥匙;我饶了两圈之后回到第 \(p\) 个房间,我还剩下 \(5-3=2\) 把钥匙。所以这跟我一开始就找 \(8 \text{ mod } 3 = 2\) 把钥匙是一样的效果。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
int has[10010][110], num[10010][110], sum[10010], n, m, p, ans;
const int MOD = 20123;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
cin >> has[i][j] >> num[i][j];
sum[i] += has[i][j];
}
}
cin >> p;
for (int i = 0; i < n; i ++) {
int val = num[i][p] % sum[i];
ans = (ans + num[i][p]) % MOD;
if (val) { // 如果不能整除,从p开始逆时针找第 val%sum[i]把钥匙
while (true) {
if (has[i][p]) {
val --;
if (!val) break;
p = (p+1) % m;
}
else {
p = (p+1) % m;
}
}
}
else { // 如果能整除,从p-1开始顺时针找第一把钥匙
while (true) {
p = (p+m-1) % m;
if (has[i][p]) break;
}
}
}
cout << ans << endl;
return 0;
}
原文地址:https://www.cnblogs.com/quanjun/p/12698163.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android使用Kotlin实现多节点进度条
- Android中webView加载H5绑定cookie实例
- 解决Android webview设置cookie和cookie丢失的问题
- Android实现清除单个域名的cookie
- Android实现触发html页面的Button控件点击事件方式
- webview添加参数与修改请求头的user-agent实例
- android webview获取html代码和根据id获取value实例
- pip 安装MySQL-python:EnvironmentError: mysql_config not found
- 关于WebView 重定向行为导致的多次加载的问题
- 解决webview内的iframe中的事件不可用的问题
- Android WebView拦截iframe标签内部跳转教程
- Android实现WebView点击拦截跳转原生
- Android实现带节点的进度条
- Android WebView userAgent 设置为桌面UA实例
- Android WebView 内处理302重定向不跳转的解决