模拟算法
有时的模拟算法需要转着圈的来模拟。
比如 玩具谜题
首先定义cur
顺时针的写法: cur=(cur+x)%n
逆时针的写法: cur=(cur-x+n)%n
练习
#include <iostream>
using namespace std;
int a[11];
int main()
{
int n,x=1;
cin>>n;
int cur=n-1;
a[cur]=1;
for(int i=1;i<=1000;i++)
{
cur=(cur+x)%10;
a[cur]=1;
x++;
}
for(int i=0;i<10;i++)
{
if(a[i]==0)
{
cout<<i+1<<" ";
}
}
return 0;
}
模拟算法
模拟算法一般会把执行过程都写在题里了,有时候用其它方法很麻烦。比如P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布用if太麻烦了,所以我建议用打表比较好 ,大括号之间用逗号分隔。
int g[5][5]={{0,-1,1,1,-1},{1,0,-1,1,-1},{-1,1,0,-1,1},{-1,-1,1,0,1},{1,1,-1,-1,0}};
练习
生活大爆炸版石头剪刀布
答案:
#include <iostream>
using namespace std;
int g[5][5]={{0,-1,1,1,-1},{1,0,-1,1,-1},{-1,1,0,-1,1},{-1,-1,1,0,1},{1,1,-1,-1,0}};
int a[210];
int b[210];
int main(int argc, char** argy)
{
int n,na,nb,sum1=0,sum2=0;
cin>>n>>na>>nb;
for(int i=0;i<na;i++)
{
cin>>a[i];
}
for(int i=0;i<nb;i++)
{
cin>>b[i];
}
for(int i=0;i<n;i++)
{
int A=a[i%na];
int B=b[i%nb];
if(g[A][B]==1)
{
sum1++;
}
if(g[B][A]==1)
{
sum2++;
}
}
cout<<sum1<<" "<<sum2;
return 0;
}