「C++」简单模拟
这是一个公式:
\]
根据大家的数学经验可以知道这是一个计算斐波那契数列的公式,那么假设我们不知道这是一个斐波纳契数列的公式,只知道他是一个简单的数学计算公式,该怎么求这个公式的值呢?答案就是需要使用模拟!而这篇博文,我们就来讨论一些简单的模拟题目,再教给大家一些做模拟题的方法。
Q1:使用公式求斐波那契数列第n项值
这是一个非常简单的模拟,可以直接使用C++头文件cmath
中的库函数完成,这里我们可以看到题目中有两个比较难搞的东西,一个是:$$\sqrt{5} $$而另一个就是$${m}^{n} (m指的是前面的算式,分别是\left(\frac{1+\sqrt{5}}{2}\right)和\left(\frac{1-\sqrt{5}}{2}\right))$$
根号可以使用sqrt
函数,而m的n次方可以使用pow
函数(或者位运算),注意,这两个函数的返回值都是double类型的,所以最好使用double类型存储,而且pow函数会有精度误差,所以一定要谨慎使用。
接下来给大家看一下初步的代码:
#include<bits/stdc++.h>
using namespace std;
// 该函数用于计算斐波那契数列的第n项
double fibonacci(int n) {
// 特判
if(n <= 0) {
return 0;
}
// 模拟
double phi = (1 + sqrt(5)) / 2;
double psi = (1 - sqrt(5)) / 2;
double numerator = pow(phi, n) - pow(psi, n);
double denominator = sqrt(5);
return numerator / denominator;
}
int main() {
int n;
cin >> n; // 读入
// 设置输出精度,以便更好地显示浮点数结果
cout << fixed << setprecision(2); // 这里我们输出两位小数
if (n >= 1) {
double res = fibonacci(n);
cout << "Fibonacci number at index " << n << " is: " << res << endl;
} else {
cout << "No answer" << endl;
}
return 0;
}
输出一下,完全正确!
这里我们定义了一个函数fibonacci
,该函数用于求斐波那契数列的第n项,在函数里面,我们定义了四个变量:phi
、psi
、numerator
和denominator
。
phi
求的是分数分子的左边部分(减号前的部分);
psi
求的是分数分子的右半部分(减号后的部分);
numerator
顾名思义是分子;
denominator
顾名思义就是分母。
最后的返回值就是分数值(也就是分子除以分母)
接下来我们来看一看下一个问题。
Q2:[NOIP2003 普及组] 乒乓球
题目背景
国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 \(11\) 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 \(11\) 分制和 \(21\) 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
题目描述
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 \(11\) 分制和 \(21\) 分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中 \(\texttt W\) 表示华华获得一分,\(\texttt L\) 表示华华对手获得一分):
\(\texttt{WWWWWWWWWWWWWWWWWWWWWWLW}\)
在 \(11\) 分制下,此时比赛的结果是华华第一局 \(11\) 比 \(0\) 获胜,第二局 \(11\) 比 \(0\) 获胜,正在进行第三局,当前比分 \(1\) 比 \(1\)。而在 \(21\) 分制下,此时比赛结果是华华第一局 \(21\) 比 \(0\) 获胜,正在进行第二局,比分 \(2\) 比 \(1\)。如果一局比赛刚开始,则此时比分为 \(0\) 比 \(0\)。直到分差大于或者等于 \(2\),才一局结束。
你的程序就是要对于一系列比赛信息的输入(\(\texttt{WL}\) 形式),输出正确的结果。
输入格式
每个输入文件包含若干行字符串,字符串有大写的 \(\texttt W\) 、 \(\texttt L\) 和 \(\texttt E\) 组成。其中 \(\texttt E\) 表示比赛信息结束,程序应该忽略 \(\texttt E\) 之后的所有内容。
输出格式
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 \(11\) 分制下的结果,第二部分是 \(21\) 分制下的结果,两部分之间由一个空行分隔。
样例 #1
样例输入 #1
WWWWWWWWWWWWWWWWWWWW
WWLWE
样例输出 #1
11:0
11:0
1:1
21:0
2:1
提示
每行至多 \(25\) 个字母,最多有 \(2500\) 行。
(注:事实上有一个测试点有 \(2501\) 行数据。)
【题目来源】
NOIP 2003 普及组第一题
分析
这是一道很经典的签到模拟题,我们可以直接根据题意模拟:
#include<bits/stdc++.h>
using namespace std;
int win[114514];
int w, l;
int main() {
char s;
for(int i = 1; cin >> s && s != 'E'; ++ i) {
if(s == 'W') win[i] = 1;
else win[i] = 2;
}
for(int i = 1; ; ++ i) {
if(win[i] == 1) ++ w;
if(win[i] == 2) ++ l;
if(win[i] == 0) {
cout << w << ":" << l << endl << endl;
break;
}
if(w - l >= 2 || l - w >= 2)
if(w >= 11 || l >= 11) {
cout << w << ":" << l << endl;
w = 0;
l = 0;
}
}
w = 0;
l = 0;
for(int i = 1; ; ++ i) {
if(win[i] == 1) ++ w;
if(win[i] == 2) ++ l;
if(win[i] == 0) {
cout << w << ":" << l;
break;
}
if(w - l >= 2 || l - w >= 2)
if(w >= 21 || l >= 21) {
cout << w << ":" << l << endl;
w = 0;
l = 0;
}
}
return 0;
}
首先一定要开数组存储胜负次数,因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。其次分数差要大于2,这是因为正规乒乓球比赛,不仅分数要大于11(或21),两者分数相差也要大于2。如果比赛分数达到11-10,比赛会继续。直到一个人比另外一个人多两分。(如13-11)21分制同理,这里不再过多阐述。
其实这两道题目的模拟算是C++当中最简单的,接下来,我会再发表几篇文章用以阐述复杂的模拟算法。
「C++」简单模拟的更多相关文章
- 「NOWCODER」CSP-S模拟赛第3场
「NOWCODER」CSP模拟赛第3场 T1 货物收集 题目 考场思路即正解 T2 货物分组 题目 考场思路 题解 60pts 算法:一维 DP 100pts 算法:一维 DP ?线段树 + 单调栈 ...
- 「CQOI2006」简单题 线段树
「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...
- 「SOL」行列式 (模拟赛)
1. 题面 有一个大小为 \(n\) (\(n\le10^6\))的方阵 \(A\),给定 \(d_1,d_2,d_3,\dots,d_n\),\((p_2,b_2,c_2),(p_3,b_3,c_3 ...
- 「数据结构」:模拟指针(simulated pointer)
模拟指针,也就是清华严老师<数据结构-C语言描述>中的静态链表,静态链表的引用是使用一段连续的存储区还模拟指针的功能,可以有效的利用一段连续内存进行一定范围内可变的子链表的空间分配,此数据 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 「考试」联赛模拟36-39,noip晚间小测2-3
36.1 party(CF623D) 很是鸡贼的一道题 首先要明确一点,抓人是有策略,而不是随机的,可以认为等同于按一个给定的顺序猜人,那么这时猜中的概率就只是抓住这个人的概率了 对于每一次猜测,因为 ...
- 「考试」noip模拟9,11,13
9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...
- 「PHP」简单工厂模式
引言 所属:创建型模式,常用设计模式之一 工厂模式分为:简单工厂模式.工厂方法模式.静态工厂模式.抽象工厂模式. 下面为简单工厂模式. 参考资料: <大话设计模式>程杰 模式概 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 「 题解」NOIP2021模拟赛(2021-07-19)
小兔的话 欢迎大家在评论区留言哦~ D - 矩阵 简单题意 一个 \(i * i\) 的 \(01\) 矩阵,若满足 每一行 和 每一列 都满足 恰好 有 \(2\) 个位置是 \(1\) 时,称为 ...
随机推荐
- 消息队列Kafka「检索组件」重磅上线!
简介:本文对消息队列 Kafka「检索组件」进行详细介绍,首先通过对消息队列使用过程中的痛点问题进行介绍,然后针对痛点问题提出相应的解决办法,并对关键技术技术进行解读,旨在帮助大家对消息队列 Kaf ...
- 开课啦 dubbo-go 微服务升级实战
简介: 杭州开课啦教育科技有限公司是一家致力于为中小学生提供学习辅导的在线教育公司,目前公司后端服务基础设施主要依托于阿里云原生,其中包含计算.网络.存储以及 Kubernetes 服务. 技术选型背 ...
- 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
简介: 阿里云 ESSD 为云服务器 ECS 提供低时延.持久性和高可靠的块存储服务,成为云厂商全闪块存储的业界标杆.存储团队推出了 ESSD Auto PL 新的云盘规格,把性能与容量解耦,提供 ...
- [Contract] 一次搞懂 ETH Gas, GasPrice, GasLimit 之间关系与使用
Gas 是一个交易费的基本单位(unit),类似汽油的单位"升",比如一次链上交易可能消耗 5 Gas 汽油,由运行的程序决定. GasPrice 是一个 Gas 的单价,一般用 ...
- 2019-7-2-WPF-通过-ReadyToRun-提升性能
title author date CreateTime categories WPF 通过 ReadyToRun 提升性能 lindexi 2019-07-02 10:29:55 +0800 201 ...
- Prometheus+Grafana+alertmanager构建企业级监控系统(二)
二.可视化UI界面Grafana的安装和配置 2.1 Grafana介绍 Grafana 是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通 知给告警接收方.它主要有以下 ...
- CF877F Ann and Books (分类统计贡献+普通莫队)
CF877F Ann and Books 题意: 商店里有 \(n\) 本书,每本书中有 \(a_i\) 个 \(t_i=1/2\) 类问题. \(m\) 次询问,每次询问给出一个区间,求有多少个符合 ...
- Solution Set - NOI真题
NOI2024 RP++! NOI2018 Day1T1 Link&Submission. 考虑一个最高的水位线使所有点通过没有积水的边就可以连通,也就是求出了一棵海拔的最大生成树.会发现只有 ...
- JSON字符串数据转换指定实体对象数据
一.引入需要的maven依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId> ...
- 🔥🔥🔥httpsok-v1.8.0 SSL证书自动续签就应该这么简单
httpsok-v1.8.0 SSL证书自动续签就应该这么简单 简介 一行命令,一分钟轻松搞定SSL证书自动续期 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx 服务器设 ...