【算法】模拟

模拟

概念

模拟就是用代码模拟出题目所要求的操作。虽然本质上比较简单,但是码量大,很难调错。所以做模拟题的时候一定要先构思好再敲代码。

例题 1

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 19701100:00:00 到当前时刻经过的毫秒数。现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。给定一个用整数表示的时间,请将这个时间对应的时分秒输出。数据范围:给定的时间不超过 1018

我们直接把输入的时间 t 除以 1000 变成秒(毫秒和秒之间的进率为 1000)。然后再时间转换,天为 tmod(602×24)÷602,小时为 tmod(602×24)mod602÷60,分钟为 tmod(602×24)mod60。这里为了方便,我们定义 d=602×24h=602m=60。时间复杂度 O(1)。注意,一定要开 long long

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;

using ll = long long;

const int kMaxN = -1, kInf = (((1 << 30) - 1) << 1) + 1;
const ll kLInf = 9.22e18;
const ll d = 24 * 60 * 60, h = 60 * 60, m = 60; // 定义常量 d, h, m

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ll t;
  cin >> t; // 输入 t
  t /= 1000; // 把 t 除以 1000(把毫秒转换成秒)
  ll day = t % d / h, hour = t % d % h / m, _min_ = t % d % m;
  // 计算天,小时,分钟(注意这里 min 只能定义成 _min_)
  printf("%02d:%02d:%02d", day, hour, _min_); // 输出,格式为 dd:hh:mm
  return 0;
}

例题 2:

一只长度不计的蜗牛位于 n 英寸深的井的底部。它每次向上爬 k 英寸,但是必须休息一次才能再次向上爬。在休息的时候,它滑落了 d 英寸。之后它将重复向上爬和休息的过程。蜗牛爬出井口需要至少爬多少次?如果蜗牛爬完后刚好到达井的顶部,我们也设作蜗牛已经爬出井口。

典型蜗牛爬井问题,模拟即可。
把蜗牛的高度存在一个变量里,初始为 0,每次把变量加 k,如果 n,跳出输出次数,否则 d

int h = 0, ans = 0;
for (; ; ) {
  h += k; // 爬了 k 英寸
  if (h >= n) { // 判断是否出井
    break; // 跳出循环
  }
  h -= d; // 掉了 d 英寸
}
cout << ans << '\n'; // 输出答案·
posted @   beautiful_chicken233  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示