#146-(EZOI练习)[模拟]魔法师之恋

Description

 在《Harry Potter and the Sorcerer's Stone》中,想得到魔法石,必须要通过许许多多的测试和游戏。现在阿不思·邓布利多认为这些游戏都具有魔法力,魔法师们能够轻松的通过,我们要增加一些只能够通过智力解决的题目,需要真正的聪明人才能够通过。现在由于我们敬爱的Harry Potter同学时间有限,需要你的帮助,请你帮助他来解决这个问题。必须要在伏地魔之前得到魔法石,这样才能够保护魔法界的安全。

 游戏的规则如下:

现有一游戏,玩它时将会有方块有顺序的从屏幕顶端掉下至底部,当它碰到障碍物或底部时将停下,同时自己变成障碍物。游戏规则规定,只能从方块下落前决定下落时的横向位置,使这个方块变成障碍物后的高度最低,且如果有几种横向位置使这个方块变成障碍物后的高度最低时,取最左边的横向位置下落。

Input

第1行有2个整数,方块数n和屏幕宽度w。

第2行到n+1行每行1个整数,为第i个方块的边长a。

Output

仅包含一个整数,即为最后障碍物的最高点高度。

Sample Input

3 5
2
1
3

Sample Output

4

HINT

 

【注释】

绿的为方块1,蓝的为方块2,紫的为方块3。每次都选择保证最底点且最左

【数据规模】

对于100%的数据

1<=w<=20

1<=a<=w

1<=n<=100

(模拟俄罗斯方块?)

#include <iostream>

#define SIZE 50
#define INF 2e+09

using namespace std;

int high[SIZE], n;

int find(int a, int w) // 找最高的一个地方
{
	int res = 0, i;
	
	for (i = a; i < a + w; ++i)
	{
		res = max(res, high[i]);
	}
	
	return res;
}

void doit(int w)
{
	int _min = INF, index, temp, i;
	
	for (i = 1; i <= n - w + 1; ++i)
	{
		temp = find(i, w); // 找到最低处
		if (_min > temp)
		{
			_min = temp;
			index = i;
		}
	}
	for (i = index; i < index + w; ++i) // 模拟下落
	{
		high[i] = _min + w;
	}
	
	return;
}

int main(void)
{
	int m, x, i, res = 0;
	
	scanf("%d%d", &m, &n);
	while (m--)
	{
		scanf("%d", &x);
		doit(x);
	}
	for (i = 1; i <= n; ++i)
	{
		res = max(res, high[i]);
	}
	
	printf("%d", res);
	
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值