zoukankan      html  css  js  c++  java
  • 积木城堡

    XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡。城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木。小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大,那么城堡便不容易倒。所以他在垒城堡的时候总是遵循这样的规则。
    
    小XC想把自己垒的城堡送给幼儿园里漂亮的女孩子们,这样可以增加他的好感度。为了公平起见,他决定把送给每个女孩子一样高的城堡,这样可以避免女孩子们为了获得更漂亮的城堡而引起争执。可是他发现自己在垒城堡的时候并没有预先考虑到这一点。所以他现在要改造城堡。由于他没有多余的积木了,他灵机一动,想出了一个巧妙的改造方案。他决定从每一个城堡中挪去一些积木,使得最终每座城堡都一样高。为了使他的城堡更雄伟,他觉得应该使最后的城堡都尽可能的高。
    
    任务:
    
    请你帮助小XC编一个程序,根据他垒的所有城堡的信息,决定应该移去哪些积木才能获得最佳的效果。
    
    输入输出格式
    输入格式:
    第一行是一个整数N(N<=100),表示一共有几座城堡。以下N行每行是一系列非负整数,用一个空格分隔,按从下往上的顺序依次给出一座城堡中所有积木的棱长。用-1结束。一座城堡中的积木不超过100块,每块积木的棱长不超过100。
    
    输出格式:
    一个整数,表示最后城堡的最大可能的高度。如果找不到合适的方案,则输出0。
    
    输入输出样例
    输入样例#12
    2 11
    3 2 11
    输出样例#13
    题目描述

    我的做法:二分正确答案,但是后来发现他不满足

    单调性,因为他最后要求每个积木城堡的高度都一样,

    而每个积木的高度又都是确定的,所以不满足单调性

    水了30分

    正解:

    其实塔好积木在拿走就相当于当初搭的时候没选拿走的积木。

    这样一转化思维问题就清楚了。

    把积木可搭建的最大高度看做背包的载重,每块积木的高度就是物品的重量。

    也就是用给定的物品装指定的包,使每个包装的物品一样多,且在符合条件的前提下尽量多。

     1 #include<bits/stdc++.h>
     2 #define DB double
     3 #define ll long long
     4 using namespace std;
     5 int h[10005],v[10005],n,ni,sum,maxsum,a[10005]; 
     6 int main()
     7 {
     8     scanf("%d",&n);
     9     for(int i=1;i<=n;i++)
    10     {
    11         ni=1;sum=0;
    12         scanf("%d",&a[ni]);
    13         sum+=a[ni];
    14         while(a[ni]!=-1)
    15         {
    16             ni++;
    17             scanf("%d",&a[ni]);
    18             sum+=a[ni];
    19         }
    20         ni--;sum++;
    21         if(sum>maxsum)maxsum=sum;
    22         for(int j=1;j<=sum;j++) v[j]=0;
    23         v[0]=1;
    24         for(int j=1;j<=ni;j++)
    25          for(int k=sum;k>=a[j];k--)
    26           if(!v[k]&&v[k-a[j]])
    27            {
    28               v[k]=1;
    29               h[k]++;
    30            }
    31     }
    32     for(int i=maxsum;i>=1;i--)
    33      if(h[i]==n)
    34      {
    35          printf("%d",i);
    36          return 0;
    37      }
    38     printf("0");
    39     return 0;
    40 }
    View Code

    为什么我总是这么弱呢?

  • 相关阅读:
    Pascal's Triangle II
    Pascal's Triangle
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Populating Next Right Pointers in Each Node
    path sum II
    Path Sum
    [转载]小波时频图
    [转载]小波时频图
    [转载]Hilbert变换及谱分析
  • 原文地址:https://www.cnblogs.com/adelalove/p/9235965.html
Copyright © 2011-2022 走看看