UPC-积木

UPC-积木

题目描述

乔治喜欢玩积木。目前他有N块积木,编号为1到N。所有积木的高度都是正整数,第i块积木高度是H[i]。乔治喜欢用积木堆起尽可能高的塔。他堆积木的过程中,只需要同时满足如下三个规则:
(1)积木必须堆放在同一个列中,一个搭在另一个上面。最终的塔的高度就是构成塔的所有积木的高度总和。
(2)塔中使用的积木的编号从底部到顶部必须是递增的。换句话说,每当乔治把积木x放在积木y的上面,必须要满足编号x大于编号y。
(3)乔治永远不会把高度是偶数的积木放置在高度是奇数的积木上面。
在满足上面的前提下,塔最高是多高?

输入

多组测试数据。
第一行,一个整数G,表示有G组测试数据。1<=G<=5。每组测试数据格式如下:
第1行,一个正整数N。2<=N<=50。
第2行,N个正整数,空格分开,第i个整数就是编号为i的积木的高度H[i],1<=H[i]<=50。

输出

共G行,每行一个正整数。

Sample Input

5
2
4 7
2
7 4
1
7
1
4
7
48 1 50 1 50 1 48

Sample Output

11
7
7
4
196

Hint

扫描二维码关注公众号,回复: 10444583 查看本文章

对于第5组测试数据的解释:
从底部往顶部,依次选择第1、第3、第5、第7块积木,这样塔的高度是:48+50+50+48=196。

AC时间到

首先代码如下

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
int u[55];
int main()
{
 int t;
 cin>>t;
 while(t--)
  {
   int tot=0;
   int num;
   cin>>num;
   int maxn=0;
   for(int i=0; i<num; i++)
    {
     cin>>u[i];
     if(u[i]%2)
      tot+=u[i];
    }
   int temp=0;
   for(int i=0; i<num; i++)
    {
     if(u[i]%2)
      {
       maxn=max(maxn,temp+tot);
       tot-=u[i];
       continue;
      }
     else
      temp+=u[i];
    }
   maxn=max(temp,maxn);
   cout<<maxn<<endl;
  }
}

下面来分析一下思路

因为是偶数的不能放奇数的上面,也就是说一旦放上奇数之后就不可以再放偶数了。
那么这就可以用二叉树的思想,这个奇数是放还是不放。
如果不放,就不加上这个奇数。如果放了,那么最后的结果也就在放下这个奇数个的时候决定了。因为以后只能放奇数。
于是,我就将所有的奇数都统计一下和,于是在用奇数的时候方便直接出结果,然后可以得出最终结果之一。然后继续走不放这个奇数的情况,这里就需要把这个奇数个的去除掉。然后继续往后余生。

这个解法的复杂度仅为O(n)我觉着这个思路还挺好。嘻嘻~~

By-轮月

发布了32 篇原创文章 · 获赞 12 · 访问量 1199

猜你喜欢

转载自blog.csdn.net/qq_35339563/article/details/103396787
UPC
今日推荐