• UVA 437 The Tower of Babylon


    有些类似“叠箱子”问题,看起来一种砖有无限多个,其实最多只能用到两次。

    说下我的思路吧,一块砖有3个数据,虽然3!=6,但本质上还是只有3种,把这三种都表示出来,使x<=y;这样就有了3n组数据。因为我不会建图,就把这3n组数据再排列一下,使一块砖只能放到它后面的砖之上,而绝不能放到之前的砖上,即按x为一级y为二级升序排列,结合之前的x<=y,就能达到目的了。比如:两块砖,31*41*59和26*53*58,经过排序后变为:

    26 53 58

    26 58 53

    31 41 59

    31 59 41

    41 59 31

    53 58 26

    接下来就是DP了……

    这题我做得很坎坷,因为想用sort不用qsort,又写了回好久没写的C++;但是坑爹的sort不支持二维数组,只好改为结构体;最后因为更新状态的细节又WA了好几次。我把WA的代码贴一下:

    t = 0;

    for

    {

      for

    }

    这是其一;

    for

    {

      t = 0;

      for

    }

    这是其二。至于为什么错了,我就不说了,读者自己想吧。

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 using namespace std;
     5 typedef struct
     6 {
     7     int arr[3];
     8 }Box;
     9 Box a[100];
    10 bool cmp(Box a,Box b)
    11 {
    12     if(a.arr[0] != b.arr[0])
    13         return a.arr[0] < b.arr[0];
    14     else if(a.arr[1] != b.arr[1])
    15         return a.arr[1] < b.arr[1];
    16     else return a.arr[2] < b.arr[2];
    17 }
    18 int ok(Box a,Box b)
    19 {
    20     return (a.arr[0] < b.arr[0] && a.arr[1] < b.arr[1]);
    21 }
    22 int main()
    23 {
    24     int n,m=0,i,j,t,max;
    25     while(cin>>n,n)
    26     {
    27         m++;
    28         for(i = 0; i < 3*n; i += 3)
    29         {
    30             cin>>a[i].arr[0]>>a[i].arr[1]>>a[i].arr[2];
    31             sort(a[i].arr,a[i].arr+3);
    32             a[i+1].arr[0] = a[i].arr[0];
    33             a[i+1].arr[1] = a[i].arr[2];
    34             a[i+1].arr[2] = a[i].arr[1];
    35             a[i+2].arr[0] = a[i].arr[1];
    36             a[i+2].arr[1] = a[i].arr[2];
    37             a[i+2].arr[2] = a[i].arr[0];
    38          }
    39         sort(a,a+3*n,cmp);
    40         max = 0;
    41         for(i = 3*n-2; i >= 0; i--)
    42         {
    43             t = a[i].arr[2];
    44             for(j = i+1; j < 3*n; j++)
    45             {
    46                 if(ok(a[i],a[j]) && a[i].arr[2]+a[j].arr[2] > t)
    47                     t = a[i].arr[2]+a[j].arr[2];
    48             }
    49             a[i].arr[2] = t;
    50             if(t > max) max = t;
    51         }
    52         printf("Case %d: maximum height = %d\n",m,max);
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    Python学习心得第二周-作业
    Python学习心得第二周-02 字符串、列表、元组、字典
    Python学习心得第二周-01 数字类型
    eclipse 性能调优之内存分配
    Spring 面试
    技巧 linux 如何显示一个文件的某几行(中间几行)
    命令 scp
    机器学习遇到的好的资料
    maven 使用记录
    “冷启动”问题浅析
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/2489871.html
Copyright © 2020-2023  润新知