没有任何需要想一想的地方吧
首先,题目说“1≤N≤100000”,那么可以算出最多17层,第16层最多有32768个节点,第17层最多有
34465个节点(不加限定的话第17层可以有65536个节点,但这样一来总节点数就131071个了)。
题目又说“−100000≤Ai≤100000”,那么 34465*100000 =
0xCD6D6AA0; 同层的节点权值之和范围是[-0xCD6D6AA0,+0xCD6D6AA0],因此
四字节的具符号整型是存不下它的。
看到这里心一沉,如果评测用例没超过四字节的具符号整型,那么看出应当用long long的人反而就吃亏了。
程序代码:
#include <stdio.h>
long long foo( unsigned count )
{
long long r = 0;
for( unsigned i=0; i!=count; ++i )
{
long a;
scanf( "%ld", &a );
r += a;
}
return r;
}
int main( void )
{
unsigned long n;
scanf( "%u", &n );
unsigned layer = 0;
long long weight = 0;
for( unsigned i=0; n!=0; ++i )
{
unsigned count = (1u<<i)<=n ? (1u<<i) : n;
long long t = foo( count );
n -= count;
if( weight < t )
{
weight = t;
layer = i;
}
}
printf( "%u\n", layer+1 );
}