模拟。顾名思义,就是用计算机来模拟题目中要求的操作,比如 NOIP 2014 的 生活大爆炸版石头剪刀布 ,只需要按照题面的意思来写就可以了。
当然,模拟并不总是很好写,参见经典题目 魔兽世界 和 猪国杀 。
模拟题目通常具有码量大、操作多、思路繁复的特点。并且由于它码量大,会导致很难查错,如果在考试中写错是相当浪费时间的。
所以写模拟题,遵循以下的建议有可能会帮助你提升做题速度:
- 在动手写代码之前,在草纸上尽可能地写好要实现的流程;
- 在代码中,尽量把每个部分模块化、写成函数、结构体或类;
- 对于一些可能重复用到的概念,可以统一转化,方便处理:如,某题给你 "YY-MM-DD 时:分" 把它扔到一个函数处理成秒,会减少概念混淆;
- 调试时分块调试,模块化的好处就是可以方便的单独调某一部分;
- 写代码的时候一定要思路清晰,不要想到什么写什么,要按照落在纸上的步骤写。
实际上,上述步骤在解决其它类型的题目时也是很有帮助的。
一、倒序模拟
解题代码:
#include<iostream> #include<math.h> using namespace std; int main() { int t,i=0; long long m; cin>>t>>m; //操作次数和最终的数 long long opt[t],x[t]; for(i=0;i<t;i++){//用数组依次记录opt[i]与x[i] cin>>opt[i]>>x[i]; } for(i=t-1;i>=0;i--){//倒叙模拟 switch(opt[i]) { case 1:m=m-x[i];break; case 2:m=m+x[i];break; case 3:m=m/x[i];break; case 4:m=m*x[i];break; default : break; } } cout<<m<<endl; return 0; }
解题思路:注意运用数组思想进行每轮数据的依次存储,不要与模拟手算混淆。