75:石子合并★★★★

75:石子合并★★★★
题目描述:
有n堆石子,每次可以将任意两堆合并为一堆,这次操作消耗的体力是这两堆石子数之和。最终需要将n堆石子合并为一堆,问最少要多少体力?
这些石子十分特殊:一开始的时候第i堆石子有i个石子,i=1,2,...,n

输入:
有多组测试数据,每行一个正整数n,n<=5e8
以EOF标志结束程序。

输出:
对于每组测试,每行输出一个数,
表示最少所需要的体力

样例输入:
2
3

样例输出:
3
9

其它:
题目提供:FancyMouse

难度:Hard
  1. int Huffman(int n)
  2. {
  3.     if ( n == 1 || n == 0 )
  4.     {
  5.         cout << n << " : " << 0 << endl;
  6.         return 0;
  7.     }
  8.     if ( n == 2 )
  9.     {
  10.         cout << n << " : " << 3 << endl;
  11.         return 3;
  12.     }
  13.     int x = 0, y = 0, l = 1, r = 2;
  14.     for (int i = 3; i <= n; i++)
  15.     {
  16.         int a = max(l, r, i);
  17.         if (a == i)
  18.         {
  19.             x += y + l + r;
  20.             l += r;
  21.             r = i;
  22.             y = 0;
  23.         }
  24.         else if (a == l)
  25.         {
  26.             r = i + r;
  27.             y = y + r;
  28.         }
  29.         else if (r == a)
  30.         {
  31.             l = i + l;
  32.             x = x + l;
  33.         }
  34.         cout << i << " : " << x + y + l + r << endl;
  35.     }
  36.     return x + y + l + r;
  37. }
  38. int main(int argc, char* argv[])
  39. {
  40.     int n;
  41.     cin >> n;
  42.     Huffman(n);
  43. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值