题目网址:http://oj.onecode.com.cn/index.php/Ladder/showProblemPage/id/10148
此题又是一道讲究策略的题目,有点类似于《俄罗斯方块》题
解题思路如下:
先将残缺不齐的木板分成几个小矩形木板,如上图所示
然后从长度1一直枚举到木板长度的最大值,查看有多少小矩形木板大于等于i(循环变量)的值
并把所有满足条件的矩形木板所包含木条(指一开始输入的数据)的数量相加
再记录下经过计算后得出的新木板的面积
最后输出最大值就可以了
注意本题容易超时,要尽量减少不必要的运算
接下来给出本人AC代码:
#pragma GCC optimize(2)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m=-1,t,maxn=-1;
int mapn[10000001];
struct bo
{
int na,nu;
}box[10000001];
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>mapn[i];
if(m<mapn[i]) m=mapn[i];
if(mapn[i]!=mapn[i-1])
{
t++;box[t].na=mapn[i];
}
box[t].nu++;
}
for(int i=1;i<=m;i++)
{
int k=0;
for(int j=1;j<=t+1;j++) //因为要顾及前后代码,所以此处循环到t+1(好好自行理解)
{
if(box[j].na>=i) k+=box[j].nu;
else
{
//cout<<i<<' '<<j<<' '<<k<<' '<<k*i<<endl;
k*=i;
if(maxn<k) maxn=k;
k=0;
}
}
}
//for(int i=1;i<=t;i++) cout<<i<<':'<<box[i].na<<' '<<box[i].nu<<endl;
cout<<maxn<<endl;
return 0;
}