模拟法,顾名思义,就是利用计算机模拟问题的求解过程,从而得到问题的解。模拟法由于简单,因此又被称为"不是算法的算法"!
模拟法是学习算法的基础,通过模拟可以学习编程的各类技巧,提升初学者建立各种编程逻辑模型的感觉。大部分模拟题目直接摸拟就可以求解,还有少量模拟题目需要考生简化模拟过程,否则可能会使逻辑复杂,导致求解用时过长。
模拟法适用于问题求解清晰,运算规模较小的问题。如果问题求解的时空代价很大,就要考虑是否有其他更好的解决方案。
【案例解析】不高兴的津津
津津上初中了。妈妈认为津津应当更加用功地学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外,妈妈每周还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过8小时就会不高兴,而且上得越久就越不高兴。假设津津不会因为其他事不高兴,并且她的不高兴不会持续到第2天。请你帮忙检查津津下周的日程安排,看看她下周会不会不高兴;如果会,那么她哪天最不高兴。
输入包括7行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
输出一个数字。如果津津不会不高兴,则输出0,如果会,则输出最不高兴的是周几(用1,2,3,4,5,6,7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的那一天。
例如,输入下列数据:
5 3
6 2
7 2
5 3
5 4
0 4
0 6
则输出为3。
本题可以采用模拟方法依次判断哪天最不高兴,并将最不高兴的那一天输出。在输出过程中要注意以下几个问题。
(1)判断n个数中的最大值
cpp
max = 0;
for(i = 1; i <= n; i++)
{
scanf("%d",&a);
if(a > max)
{
max = a;
}
}
(2)数据存储问题
本题的数据一共有7组,不算多,也不算少,可以直接运算,也可以将数据存储到数组后再进行计算。
若不采用数组,则模拟的过程如下。
cpp
int a,b,s,max = 0,i,day = 0;
for(i = 1;i <= 7; i++)
{
scanf("%d%d",&a,&b);
s = a+ b;
if((s > max) && (s > 8))
{
max = s,
day = i;
}
printf("%d",day);
}
如果采用数组,则可以将数据存储起来,在后续的操作中会更加方便,也更容易理解。采用数组模拟的方法如下。
cpp
int a,b,i,day,max,array[8];
char c;
for(i = 1; i <= 7; i++)
{
scanf("%d%d",&a,&b);
array[i] = a + b;
}
max = array[0];
for(i = 1; i<= 7;i++)
{
if(max < array[i])
{
max = array[i];
day = i;
}
}
if(max > 8)
printf("%d",day);
else
printf("%d",0);
模拟法一般都不难,但也会考查一些基础算法,例如本题考查了如何在n个数中求最大值,及如何判断津津的不高兴条件。