模拟与暴力
Posted 好奇小圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟与暴力相关的知识,希望对你有一定的参考价值。
模拟
在自然界和生活中,许多现象具有不确定的性质,有些问题甚至很难建立数学模型,或者很难用计算机建立递推、递归、枚举、回溯法等算法。在这种清况下,一般采用模拟策略。而模拟策略也就是模拟某个过程,通过改变数学模型的各种参数,进而观察变更这些参数所引起过程状态的变化,由此展开算法设计。
通俗的讲就是:找不到更高效的做法时,题目怎么描述就让程序怎么运行。
约瑟夫环
已知n个人(以编号1,2,3…分别表示)围坐在一-张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。输出出列顺序和最后剩下的人。
数组实现:
利用公式(p+m-1)%n,找出要输出数组的下标其中p为开始报数的人的编号,n为当前剩下的人数
void Joseph( int n, int m)
int a[ 100],k-0,p-0;for(int i e;i<n;itt)
a[i]-i+1;
while(n>1){
p=(p+m-1)%n;
cout<<"第"<<+tk<<"个出圈的是:"<<a[p]<<endl;for(int j-p+1;j<n;jo+)
Ia[j-1]=a[j];
n--;
if(p==n) p=0;
}
cout<<"最后剩下的是:"<<a[p]<<endl;
Online judge (HDU-1073)
给定两个输入,分别表示用户的输出和正确的输出,你来模拟测评机,对两个输出进行比较。
完全相同输出“Accepted”
只有空格,tab,回车的不同,输出“Presentation Error”否则输出“Wrong Answer”
False Coin (POJ-1029)
给你n个硬币,k组称量结果。在这n个硬币中有一个是假的,他的重量跟其他的不一样(不知道大小),真硬币的重量都相同。每组第一-个数字代表左右放置硬币的数量,后面则是硬币的编号,每组后面的符号则是称量结果。问能不能确定哪个是假币,如果不能输出o.
分析:
结果为等号两边-一定是真硬币,结果为不等号肯定含有假硬币所以对于所有的不等式,将轻硬币放在lightCoins里,将重硬币放在heavyCoins里,
因为只有一个假硬币,且假硬币宋会一会儿轻一会儿重,所以最后假硬币的出现在lightCoins或者HeavyCoins的次数一定和不等号出现的次数相等。
若恰有一-个满足条件的疑似假币,则输出
暴力
暴力就是枚举,指的是从问题所有可能的解的集合中一一枚举各元素。
用题目中给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立。即为其解。
优点:算法简单,在局部地方使用枚举法,效果会十分的好
缺点:运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢。计算量容易过大
以上是关于模拟与暴力的主要内容,如果未能解决你的问题,请参考以下文章
Vicious Keyboard CodeForces - 801A (暴力+模拟)
LeetCode1486. 数组异或操作(Java/c++ 暴力模拟)