专栏文章
题解:P13426 [COCI 2020/2021 #2] Crtanje
P13426题解参与者 2已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miocbmmy
- 此快照首次捕获于
- 2025/12/02 16:52 3 个月前
- 此快照最后确认于
- 2025/12/02 16:52 3 个月前
这道题其实不难,但如果找不到一个合适的方法,真的比较难实现。
大体思路
第一步:确定最小矩阵
最小矩阵的求法较为简单:
我的方法是设一个变量表示公司净资产,然后根据 天内的净资产变化来求出公司净资产的最大值与最小值,矩阵的长为 ,高为最大值与最小值的差加一。
第二步:确定曲线
这一步也是本题的难点。为了确定曲线中每一个点的位置,我们要先观察其规律:
根据规律我们即可求出每一个点的位置了。以下为伪代码:
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 条评论,欢迎与作者交流。
正在加载评论...