小标题的超链接为原题链接,点击跳转
1.2 模拟
定义
//所谓的模拟题,运用的“模拟算法”,其实并没有什么完全准确的定义。模拟算法,用一句老话说,就是“照着葫芦画瓢”;官方化的诠释则是:根据题目表述进行筛选提取关键要素,按需求书写代码解决实际问题。
// 模拟这个算法其实并不难,主要是逻辑上的麻烦,但正常刷题时我们都不把模拟的逻辑思维理清就直接做,如果这题没有太水的话,是非常容易错的。
————————————————
版权声明:本文为优快云博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_61386381/article/details/123264225
luogu2669金币
题目
代码
// 金币
#include<iostream>
using namespace std;
int days = 0; // 存储当前天数
int k; // 输入
int ans=0; // 输出
void f(int fk)
{
int i=1;
do
{
int num=i;
while(num--)
{
days++;
ans += i;
if(days == fk) return;
}
}
while(i++);
}
int main()
{
cin >> k;
f(k);
cout << ans;
}
luogu2615神奇的幻方
题目
[外链图片转存中…(img-ScEgIkpy-1679991213733)]
代码
// 神奇的幻方
#include<iostream>
using namespace std;
const int N = 50;
int n; // 矩阵大小
int ans[N][N]; // 输出
struct node
{
int r, l, v;
node(){}
node(int rr, int ll, int vv)
{
r = rr, l = ll, v=vv;
}
};
void add(node i)
{
ans[i.r][i.l] = i.v;
}
void print()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
cout << ans[i][j] << " ";
}
cout << endl;
}
}
int main()
{
cin >> n;
node k_(1, n/2+1, 1);
add(k_);
for(int i=2; i<=n*n; i++)
{
if(k_.r == 1 && k_.l != n) // k-1在第一行但不在最后一列
{
k_.r = n, k_.l ++, k_.v ++, add(k_);
}
else if(k_.r != 1 && k_.l == n) // k-1在最后一列但不在第一行
{
k_.r -- , k_.l = 1, k_.v ++, add(k_);
}
else if(k_.r == 1 && k_.l == n) // k-1在第一行最后一列
{
k_.r = 2, k_.v++, add(k_);
}
else if(k_.r != 1 && k_.l != n && !ans[k_.r-1][k_.l+1]) // k-1既不在第一行,也不在最后一列,且右上方没有数
{
k_.r--, k_.l++, k_.v++, add(k_);
}
else
{
k_.r++, k_.v++, add(k_);
}
}
print();
}
luogu1563玩具谜题
题目
[外链图片转存中…(img-gTFw8otx-1679991213733)]
[外链图片转存中…(img-s8oMmdUI-1679991213734)]
代码
// 玩具谜题
#include<bits/stdc++.h>
using namespace std;
int n, m;
const int N = 1E5+10;
struct people
{
string name;
int face;
people(){};
people(string namee, int facee)
{
name = namee, face = facee;
}
}p[N];
int modN(int x)
{
while(x<=0)
{
x += n;
}
while(x>n)
{
x %= n;
}
return x;
}
int main()
{
cin >> n >> m;
for(int i=1; i<=n; i++)
{
int pface;
string pname;
cin >> pface >> pname;
p[i].face = pface;
p[i].name = pname;
}
int drc;
int dis;
int now=1;
for(int i=1; i<=m; i++)
{
cin >> drc >> dis;
if(drc) // 右数
{
if(p[now].face) // 朝外
now = modN(now - dis);
else // 朝内
now = modN(now + dis);
}
else // 左数
{
if(p[now].face) // 朝外
now = modN(now + dis);
else // 朝内
now = modN(now - dis);
}
}
cout << p[now].name;
}