J组一等奖冲刺:模拟算法

一、基础知识概述:

      模拟算法在考试中出现的频率非常之高,因为比较简单,代码量一般而言并不算长。因其并没有一套比较固定的框架,也能考验候选人的编程思维。当遇到一道算法题,发现其并不具备其他经典算法的特征时,可以尝试模拟过程的方向进行求解。

        例如,有如下问题:“李红的手机话费每天消费 1元,每消费3 元就可以获赠1元,一开始禾木有 10元,问最多可以用多少天?”

       这类问题有的时候会涉及数学公式,可以找到初始金额与可使用天数的关系,但这种解决方法一般比较困难。实际上,如果直接模拟手机话费消费的过程,会比较简单。编写代码时,我们可以使用两个变量分别表示“话费余额”与“天数”,在循环结构中模拟每一天的消费情况,“天数”每增加 1,“话费余额”就减少1元,并且当“天数”是3的倍数时,“话费余额”就增加1元,当话费余额为0时,停止循环,变量“天数”的值即是答案。

参考代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int days=0,money=50;
	while (money!=0)
	{
		++days;
		money--;
		if(days%3==0)
		{
			money++;
		}
	}
	cout<<days;
	return 0;
}

二、拓展知识:

①斐波那契数列:

        斐波拉契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……,因数学家莱昂纳多·斐波拉契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。这个数列从第3项开始,每一项都等于前两项之和。

        意大利数学家莱昂纳多·斐波拉契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的莱昂纳多”。1202年,他撰写了《算盘全书》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点于阿尔及利亚地区,莱昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯等地研究数学。另外斐波拉契还在计算机C语言程序题中应用广泛。

②开关灯问题:简介:
        
诸如灯的开关、站队、纸牌翻转等凡具有两种状态的问题,均可以用 1 代表一种状0代表一种状态,借助数组工具来实现。

a[i]的值取1或0代表第 1个对象的状态,注意与a[i]的区别。

具体实现步骤
1、开始状态(一重循环)
2、变化过程
    ※ 有限次变化:一重循环
    ※ 无限次变化:二重循环

3、最终状态(一重循环)

三、典型例题、

[约瑟夫问题]

有m个人,其编号分别为1~m,按顺序围成一个圆。
现在给定一个数 n,从第一个人开始依次报数,报到n的人出圈,然后再从下一个人开始,继续从  开始依次报数,报到  的人再出圈.....如此循环,直到最后一个人出圈为止。
编程输出所有人出圈的顺序。
输入格式
一行两个正整数 m 和 n(1≤m<100,1≤n≤32767).
输出格式
输出 m 行,每行一个正整数,表示依次出圈的人的编号。
输入
8    5
输出样例
5
2

8

7

1

4

6

3

参考代码:

#include<bits/stdc++.h>
using namespace std;
bool a[105];
int main()
{
	long long m,n,cnt=0,k;
	cin>>m>>n;
	k=m;
	for(int i=1;i<=m;++i)
	{
		a[i]=1;
	}
	while(1)
	{
		for(int i=1;i<=m;++i)
		{
			if(a[i]==1)
			{
				++cnt;
				if(cnt==n)
				{
					a[i]=0;
					cnt=0;
					k--;
					cout<<i<<endl;
					if(k==0)
					{
						return 0;
					}
				}
			}
		}
	}
	return 0;
}

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值