#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N = 2010;
const int INF = 100000;
int h[N];
int main(){
int n,w,a,maxx=0;
cin>>n>>w;
mem(h,0);
for(int i=0;i<n;i++){
cin>>a;
int minn=9999,mi;
for(int j=0;j<w-a+1;j++){
int max=0;
for(int k=j;k<=j+a-1;k++){
if(h[k]>max){
max=h[k];
}
}
if(max<minn){
minn=max;
mi=j;
}
}
for(int j=mi;j<=mi+a-1;j++){
h[j]=minn+a;
}
}
for(int i=0;i<w;i++){
maxx=max(h[i],maxx);
}
cout<<maxx;
}
题目描述
首先把经典的俄罗斯方块简化一下:方块有顺序的从屏幕顶端掉下至底部,当碰到障碍物或底部时停下,同时变成新的障碍物。游戏规则规定:只能在方块下落停止前决定下落时的横向位置,使这个方块变成障碍物后的高度最低,且如果有多个位置都可以让这个方块变成障碍物后的高度最低时,取最左边的横向位置下落。
输入
第1行有2个整数,表示方块数n和屏幕宽度w
第2行~i+1行,每行1个整数,为第i个方块的边长a
输出
一个整数,表示最后障碍物的最高点高度
样例输入
3 5
2
1
3
样例输出
4
数据范围限制
对于100%数据满足:1<=w<=20 , 1<=a<=w ,1<=n<=100