模拟
模拟就是用代码模拟出题目所要求的操作。虽然本质上比较简单,但是码量大,很难调错。所以做模拟题的时候一定要先构思好再敲代码。
例题 1:
小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 \(1970\) 年 \(1\) 月 \(1\) 日 \(00:00:00\) 到当前时刻经过的毫秒数。现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。给定一个用整数表示的时间,请将这个时间对应的时分秒输出。数据范围:给定的时间不超过 \(10^{18}\)。
我们直接把输入的时间 \(t\) 除以 \(1000\) 变成秒(毫秒和秒之间的进率为 \(1000\))。然后再时间转换,天为 \(t \bmod (60^2 \times 24) \div 60^2\),小时为 \(t \bmod (60^2 \times 24) \bmod 60^2 \div 60\),分钟为 \(t \bmod (60^2 \times 24) \bmod 60\)。这里为了方便,我们定义 \(d = 60^2 \times 24\),\(h = 60^2\),\(m = 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\),如果 \(\ge n\),跳出输出次数,否则 \(-d\)。
int h = 0, ans = 0;
for (; ; ) {
h += k; // 爬了 k 英寸
if (h >= n) { // 判断是否出井
break; // 跳出循环
}
h -= d; // 掉了 d 英寸
}
cout << ans << '\n'; // 输出答案·
标签:24,bmod,times,60,算法,include,蜗牛,模拟
From: https://www.cnblogs.com/bc2qwq/p/18001204/imitate