zoukankan      html  css  js  c++  java
  • 积木

     

    积木

    时间限制: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 }
  • 相关阅读:
    浏览器图片渲染优化教程
    C#把 DataTable转换为Model实体
    .NET静态变量与静态方法并发的问题
    三种方法查看MySQL数据库的版本
    Mysql 存储引擎 InnoDB与Myisam的主要区别
    dotnet core 出现Can not find runtime target for framework '.NETCoreApp,Version=v1.6' 的解决办法
    细说 C# 中的 IEnumerable和IEnumerator接口
    ASP.NET CORE dotnet run 命令使用debug方式运行
    安装了插件情况下 强制开启火狐浏览器的多进程功能
    JSON 字符串中的中括号和大括号区别详解
  • 原文地址:https://www.cnblogs.com/hpuwangjunling/p/2388870.html
Copyright © 2011-2022 走看看