第十三届蓝桥杯大赛C++B组:修剪灌木

只会暴力。
为了保险,来回跑了三遍。
来回三遍和四遍结果一样的,大概都跑出来了。
不带脑子的暴力(可能TL了)
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int h[N];
int mh[N];
int num=1;
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
h[j]++;
}
h[i]=0;
for(int j=1;j<=n;j++)
{
mh[j]=max(h[j],mh[j]);
}
}
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=n;j++)
{
h[j]++;
}
h[i]=0;
for(int j=1;j<=n;j++)
{
mh[j]=max(h[j],mh[j]);
}
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
h[j]++;
}
h[i]=0;
for(int j=1;j<=n;j++)
{
mh[j]=max(h[j],mh[j]);
}
}
for(int i=1;i<=n;i++)
{
printf("%d\n",(mh[i]+1));
}
return 0;
}
找到规律就简单了
主要是要敢于发挥思维,不要有暴力了就求安稳。
从第i个往后到再回来是2*(n-i)
从第i个往前到再回来是2*(i-1)
最大的必定在两个中产生,所以全部遍历取较大值就ok了。
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int h[N];
int mh[N];
int num=1;
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
mh[i]=max(2*(i-1),2*(n-i));
}
for(int i=1;i<=n;i++)
{
printf("%d\n",(mh[i]));
}
return 0;
}
这篇博客介绍了如何使用C++解决第十三届蓝桥杯大赛中关于修剪灌木的问题。作者首先展示了朴素的暴力求解方法,通过双重循环计算每个位置的最大高度,然后优化算法,通过数学分析减少计算次数,提高效率。博客强调了理解问题规律和避免过度依赖暴力解法的重要性。

被折叠的 条评论
为什么被折叠?



