洛谷P8924题解

洛谷 P8924 题解

题目描述

给你一个函数,画出它的函数图像(* 表示经过该点,. 表示不经过该点),大小为 \(n\times m\),其中 \(x\) 的范围是 \([0,n-1]\)\(f(x)\) 的范围是 \([0,m-1]\)


题目分析

题目比较简单,我们看到数据范围,直接选择暴力枚举。

首先开一个二维字符数组 \(maps\) 记录数据。记得初始化为 .。(这里手动初始化,也可以选择使用 memset。)

for(int i = 0;i<500;i++)
{
    for(int j = 0;j<500;j++)
    {
        maps[i][j] = '.';
    }
}

然后处理输入,将输入的系数保存供后续使用。

for(int i = 0;i<=k;i++)
{
    scanf("%lld",&nums[i]);
}

之后循环遍历 \(x\)\(k\),计算每一个 \(x\) 对应的函数值。由于函数值可能很大,这里需要加一个特判,避免数组爆炸。

int sum;
for (int x = 0; x < n; x++)
{
    sum = 0;
    for (int i = 0; i <= k; i++)
    {
        sum += nums[i] * pow(x, i);
    }
    if (sum < m)
    {
        maps[x][sum] = '*';
    }
}

最终我们可以愉快的输出,记得纵坐标是倒序的哦。

for (int i = n - 1; i >= 0; i--)
{
    for (int j = 0; j < m; j++)
    {
        cout << maps[j][i];
    }
    cout << endl;
}

完整 AC 代码如下

#include <bits/stdc++.h>
using namespace std;
#define max_n 510
#define int long long
char maps[max_n][max_n];
int n, m, k;
int nums[max_n];
signed main()
{
    scanf("%lld%lld%lld", &n, &m, &k);
    for (int i = 0; i < 500; i++)
    {
        for (int j = 0; j < 500; j++)
        {
            maps[i][j] = '.';
        }
    }
    for (int i = 0; i <= k; i++)
    {
        scanf("%lld", &nums[i]);
    }
    int sum;
    for (int x = 0; x < n; x++)
    {
        sum = 0;
        for (int i = 0; i <= k; i++)
        {
            sum += nums[i] * pow(x, i);
        }
        if (sum < m)
        {
            maps[x][sum] = '*';
        }
    }

    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = 0; j < m; j++)
        {
            cout << maps[j][i];
        }
        cout << endl;
    }
    return 0;
}
posted @ 2023-01-28 13:17  cn_ryh  阅读(24)  评论(0)    收藏  举报