第十三届蓝桥杯大赛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;
}