题目:魔法石之恋

题目描述

【问题描述】
在《Harry Potter and the Sorcerers Stone》中,想得到魔法石,必须要通过许许多多的测试和游戏。现在阿不思•;邓布利多认为这些游戏都具有魔法力,魔法师们能够轻松的通过,我们要增加一些只能够通过智力解决的题目,需要真正的聪明人才能够通过。现在由于我们敬爱的Harry Potter同学时间有限,需要你的帮助,请你帮助他来解决这个问题。必须要在伏地魔之前得到魔法石,这样才能够保护魔法界的安全。
游戏的规则如下:
现有一游戏,玩它时将会有方块有顺序的从屏幕顶端掉下至底部,当它碰到障碍物或底部时将停下,同时自己变成障碍物。游戏规则规定,只能从方块下落前决定下落时的横向位置,使这个方块变成障碍物后的高度最低,且如果有几种横向位置使这个方块变成障碍物后的高度最低时,取最左边的横向位置下落。

出自:宜昌一中

输入格式

【输入】
(1)第一行有2个整数,方块数n和屏幕宽度w。
(2)2行到n+1行每行1个整数,为第i个方块的边长a。.

输出格式

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

 

 

题解:

模拟,不过花了我好一段时间。

代码实现:

View Code
 1 #include<iostream>
2 using namespace std;
3
4 int w,n,h[2001]={0};
5
6 int main()
7 {
8 int i,j,k,l;
9 cin>>n>>w;
10
11 for(i=1;i<=n;i++)
12 {
13 cin>>h[0];
14 int max=100000;
15 for(j=1;j<=w;j++)
16 {
17 if(h[j]>=max) continue;
18 int ans=0;
19 for(k=1;k<=w;k++)
20 if(h[k]<=h[j])
21 {ans++;if(ans>=h[0]&&k>=j) {l=k;max=h[j];break;}}
22 else {ans=0;}
23 }
24 int x=max+h[0];
25 for(j=l-h[0]+1;j<=l;j++)
26 h[j]=x;
27
28 }
29
30 int max=0;
31 for(i=1;i<=w;i++)
32 if(h[i]>max) max=h[i];
33
34 cout<<max<<endl;
35 system("pause");
36 return 0;
37
38 }

 

posted on 2012-01-29 11:27  怡红公子  阅读(361)  评论(0编辑  收藏  举报