题目网址:http://oj.onecode.com.cn/index.php/Ladder/showProblemPage/id/10148

此题又是一道讲究策略的题目,有点类似于《俄罗斯方块》题

解题思路如下:

OneCode(天梯六) C:回收再利用(题解)

先将残缺不齐的木板分成几个小矩形木板,如上图所示

然后从长度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;
}

 

相关文章:

  • 2021-07-03
  • 2022-02-09
  • 2022-02-07
  • 2021-09-25
  • 2021-08-01
  • 2021-09-10
  • 2021-10-30
  • 2022-12-23
猜你喜欢
  • 2021-11-23
  • 2021-06-25
  • 2022-12-23
  • 2022-02-07
  • 2022-12-23
  • 2021-11-13
  • 2022-12-23
相关资源
相似解决方案