专栏文章

题解:P13426 [COCI 2020/2021 #2] Crtanje

P13426题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miocbmmy
此快照首次捕获于
2025/12/02 16:52
3 个月前
此快照最后确认于
2025/12/02 16:52
3 个月前
查看原文
这道题其实不难,但如果找不到一个合适的方法,真的比较难实现。

大体思路

第一步:确定最小矩阵

最小矩阵的求法较为简单:
我的方法是设一个变量表示公司净资产,然后根据 nn 天内的净资产变化来求出公司净资产的最大值与最小值,矩阵的长为 nn,高为最大值与最小值的差加一。

第二步:确定曲线

这一步也是本题的难点。为了确定曲线中每一个点的位置,我们要先观察其规律: 根据规律我们即可求出每一个点的位置了。以下为伪代码:
CPP
h[i]=z;
if(a[i]=='='&&a[i+1]=='-') z--;
if(a[i]=='+'&&a[i+1]!='-') z++;
if(a[i]=='-'&&a[i+1]=='-') z--;
确定曲线中每一个点的位置后,我们只需打印出曲线矩阵即可。

详细代码

CPP
#include <bits/stdc++.h>
using namespace std;
int n,z=100,mx=100,mn=100;//初始公司净资产设为100,防止下标越界
int h[1005];//记录曲线中每一个点的位置
char a[1005];//记录净资产变化
char s[1005][1005];//输出的曲线矩阵
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        h[i]=z;//记录曲线中每一个点的位置
        mx=max(mx,z);//求净资产最大值
        mn=min(mn,z);//求净资产最小值

        if(a[i]=='='&&a[i+1]=='-') z--;
        if(a[i]=='+'&&a[i+1]!='-') z++;
        if(a[i]=='-'&&a[i+1]=='-') z--;
        /*
        if求曲线中下一个点的位置
        */
    }
    for(int i=1;i<=n;i++){
        for(int j=mn;j<=mx;j++){
            if(j==h[i]) s[j][i]=a[i];
            else s[j][i]=='.';
            /*
            将输出矩阵成型
            */
        }
    }
    for(int i=mx;i>=mn;i--){
        for(int j=1;j<=n;j++){
            if(s[i][j]=='+') cout<<"/";
            else if(s[i][j]=='-') cout<<char(92);//我太蒻了,发现不能直接输出反斜杠,只好这样。
            else if(s[i][j]=='=') cout<<"_";
            else cout<<'.';
        }
        cout<<endl;
    }
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...