坦然玲子  

 

积木

时间限制:3000 ms  |  内存限制:65535 KB
难度:1
 
描述

在一个矩形的坑的底部,无缝地铺了一层积木(为简单起见,本题中,用矩形表示积木),如下图所示(阴影部分表示地,中空的部分表示坑,所有的白色矩形都表示坑底的积木):

 

现在,我们要在这个坑中再放入一块正方形积木,但我们希望这块积木的位置最低。如下图所示,左图中的灰色积木的位置就比右图中灰色积木的位置更好(本题不考虑重力因素,假定新放入的积木不会倾倒,它的边永远平行于坑壁)。而且,可以看出,左图中灰色方块的位置是所有可能的位置中最低的位置(本题中,假定坑足够宽也足够深,后加的那块积木不会放不进去)。

 

如果事先给定所有事先铺好的积木的信息和后加的积木的信息,请编写程序寻找一下它的最低位置。
 
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据 第一行为一个整数m(<=20),表示坑底积木的数量

之后m行,每行两个整数,依次表示从左至右的每块积木的宽度和高度(以厘米为单位)。
每组测试数据最后一行中还有一个整数 ,表示后加的积木的边长(以厘米为单位)(<1000)
输出
每组测试数据输出只有一个整数,表示将后加的积木放入坑中最低位置之后,它的上沿距离坑底地面的高度,每个输出占一行。
样例输入
1
2
10 40
15 60
20

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6   
 7   int i,j,w[30],h[30],k[30];
 8   int n,b,hi,t;
 9   cin>>t;
10   while(t--)
11   {
12    int l[30]={0},r[30]={0};
13     cin>>n;
14     for (i=0;i<n;i++)
15      cin>>w[i]>>h[i];
16     cin>>b;
17     for (i=0;i<n;i++)
18      for (j=i;j<n-1;j++)
19       if (h[j+1]<h[i])
20         r[i]+=w[j+1];
21       else
22         break;
23  
24    for (i=0;i<n;i++)
25     for (j=i;j>=1;j--)
26       if (h[j-1]<h[i])
27         l[i]+=w[j-1];
28       else  
29         break;
30 
31    for (i=0;i<n;i++)
32     k[i]=r[i]+l[i]+w[i];
33 
34    for (i=0;i<n;i++)
35     if (k[i]>b)
36       break;
37 
38    hi=h[i];
39    for (;i<n;i++)
40     if (k[i]>b&&h[i]<hi)
41       hi=h[i];
42 
43    cout<<hi+b<<endl;
44   }
45   return 0;
46 }

 

方法二:

 1 #include<cstdio>
 2 
 3 struct jimu 
 4 {   
 5 int w;    
 6 int h; 
 7 }s[21];
 8 
 9 int main() 
10 {    
11   int z,n,i,j,k,min,w[21];     
12   scanf("%d",&z);    
13   while(z--)     
14  {        
15    scanf("%d",&n);        
16   for(i=0;i<n;i++)        
17   {            
18     scanf("%d%d",&s[i].w,&s[i].h);             
19     w[i]=s[i].w;         
20   }         
21   scanf("%d",&k);        
22   for(i=0,min=9999999;i<n;i++)         
23   {             
24    if(s[i].h>=min) continue;             
25    for(j=1;i>=j && s[i-j].h<=s[i].h;j++)                 
26     w[i]+=s[i-j].w;             
27    for(j=1;i+j<n && s[i+j].h<=s[i].h;j++)                
28      w[i]+=s[i+j].w;             
29     if(w[i]>=k) min=s[i].h;         
30   }         
31   printf("%d\n",min+k);     
32  }     
33   return 0; 
34 }

 

posted on 2012-03-10 12:14  坦然玲子  阅读(705)  评论(0编辑  收藏  举报