积木
时间限制: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 }