zoukankan      html  css  js  c++  java
  • 模拟与高精度

    模拟

    0 什么是模拟

    模拟就是按照题意建模,题目让你干什么你就照着它干什么。

    模拟的思路非常简单,基本不需要思考。但模拟题有码量大,难调试等缺点,在考场写错也非常浪费时间。

    1 经典例题

    扫雷游戏

    solution

    这是一道再简单不过的模拟题了。
    直接找到一个地雷然后按照题意对它周围的空格内的数加一即可。
    注意边界问题。
    时空复杂度: $O(N^2)$

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int n, m;
    char mp[110][110];
    int ans[110][110];
    int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
    int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
    int main() {
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            scanf("%s", mp[i] + 1);
            for (int j = 1; j <= m; j++) {
                if (mp[i][j] == '*') {
                    for (int k = 0; k < 8; k++) {
                        ans[i + dx[k]][j + dy[k]]++;
                    }
                }
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (mp[i][j] == '*') {
                    cout << '*';
                } else {
                    cout << ans[i][j];
                }
            } cout << endl;
        } cout << endl;
        return 0;
    }

    习题:

    因为作者时间紧张,所以部分习题不配有题解,如有需要,请在评论区告知,谢谢!
    一些须知

    P1563 玩具谜题

    P1328 生活大爆炸版石头剪刀布

    P4924 [1007]魔法少女小Scarlet

    P1065 作业调度方案

    P3952 时间复杂度

    2 高精度运算

    P1601 A+B Problem(高精)

    以下摘自百度百科
    
    高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。
    一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。
    对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。
    高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。

    高精度就是处理普通数据类型存不下的数之间的运算。

    相信大家都学过列竖式,高精度其实就是在模拟列竖式的过程。

    首先要解存储的问题。

    我们可以用字符串输入,然后用一个int型的数组来存储。

    这里我们可反向存储,方便我们从低位开始运算也方便高位进位。

    接下来我们就开始模拟小学列竖式,从低位加起,超过十就进位。

    核心代码:

    //a+b=c
    //代码有漏洞请指出 
    int a[MAX], b[MAX], c[MAX];//用a[0]存储位数,bc同理
    //假设a,b已经预处理好
    c[0] = max(a[0], b[0]);
    for (int i = 1; i <= c[0]; i++) {
        c[i] += (a[i] + b[i]) % 10;
        c[i + 1] += (a[i] + b[i]) / 10;
    }
    //处理进位 
    while (c[c[0] + 1]) {
        c[c[0] + 2] += c[c[0] + 1] / 10;
        c[c[0] + 1] %= 10;
        c[0]++;
    }
    //反向输出即为答案 
    for (int i = c[0]; i; i--) {
        cout << c[i];
    }

    减法,乘法和除法与加法类似,这里不再赘述。

    练习

    P1601 A+B Problem(高精)

     

    P1303 A*B Problem

    P1009 阶乘之和(A+B&A*B)

    P1045 麦森数

    挑战:P1080 国王游戏(涉及贪心,后续也会讲到)

    3 大模拟挑战

    模拟有时也会出得很变态。

    以下几道大模拟做一道就差不多了。

    P2482 [SDOI2010]猪国杀

    P2586 [ZJOI2008]杀蚂蚁

    P3693 琪露诺的冰雪小屋

  • 相关阅读:
    图2(矩环问题)
    图1(八连块)
    恶补一下DP+背包专题(刷刷水题)L2
    food(洛谷P4040 [AHOI2014/JSOI2014]宅男计划)
    滑动窗口
    Lawnmower(洛谷 CF115B)
    Price(洛谷P4109 [HEOI2015]定价)
    逆序对
    矩阵
    1.25日考试
  • 原文地址:https://www.cnblogs.com/zcr-blog/p/12609630.html
Copyright © 2011-2022 走看看