75:石子合并★★★★
题目描述:
有n堆石子,每次可以将任意两堆合并为一堆,这次操作消耗的体力是这两堆石子数之和。最终需要将n堆石子合并为一堆,问最少要多少体力?
这些石子十分特殊:一开始的时候第i堆石子有i个石子,i=1,2,...,n
输入:
有多组测试数据,每行一个正整数n,n<=5e8
以EOF标志结束程序。
输出:
对于每组测试,每行输出一个数,
表示最少所需要的体力
样例输入:
2
3
样例输出:
3
9
其它:
题目提供:FancyMouse
难度:Hard
有n堆石子,每次可以将任意两堆合并为一堆,这次操作消耗的体力是这两堆石子数之和。最终需要将n堆石子合并为一堆,问最少要多少体力?
这些石子十分特殊:一开始的时候第i堆石子有i个石子,i=1,2,...,n
输入:
有多组测试数据,每行一个正整数n,n<=5e8
以EOF标志结束程序。
输出:
对于每组测试,每行输出一个数,
表示最少所需要的体力
样例输入:
2
3
样例输出:
3
9
其它:
题目提供:FancyMouse
难度:Hard
- int Huffman(int n)
- {
- if ( n == 1 || n == 0 )
- {
- cout << n << " : " << 0 << endl;
- return 0;
- }
- if ( n == 2 )
- {
- cout << n << " : " << 3 << endl;
- return 3;
- }
- int x = 0, y = 0, l = 1, r = 2;
- for (int i = 3; i <= n; i++)
- {
- int a = max(l, r, i);
- if (a == i)
- {
- x += y + l + r;
- l += r;
- r = i;
- y = 0;
- }
- else if (a == l)
- {
- r = i + r;
- y = y + r;
- }
- else if (r == a)
- {
- l = i + l;
- x = x + l;
- }
- cout << i << " : " << x + y + l + r << endl;
- }
- return x + y + l + r;
- }
- int main(int argc, char* argv[])
- {
- int n;
- cin >> n;
- Huffman(n);
- }