这道题只需要把最小的两个果堆加起来就可以了,好多大佬都用的是优先队列,但由于本人太菜,只好用数组做。
如果这样想,那么每合并一次都需要排一次序,但事实上并不需要这么做(而且这样会超时,我之前用sort函数排就过了四个点,后面全都tle了),只需要给新合并的果堆找到所在的位置,并且将空的果堆删除就可以了。
下面AC代码。
1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 #include <cstdio> 5 #include <string> 6 #include <cstring> 7 8 using namespace std; 9 10 int a[100000]; 11 12 int main() 13 { 14 int n, sum = 0; 15 cin >> n; 16 for (int i = 1; i <= n; i++) 17 { 18 cin >> a[i]; 19 } 20 sort(a + 1, a + n + 1); 21 while (1) 22 { 23 int j = 1; 24 while (a[j] == 0) 25 { 26 j++; 27 } 28 if (j == n) 29 { 30 break; 31 } 32 else 33 { 34 a[j] += a[j + 1]; 35 sum += a[j]; 36 for (int l = j + 1; l<n; l++) 37 { 38 a[l] = a[l + 1]; 39 } 40 n--; 41 } 42 for (int l = j; l<n; l++) 43 { 44 if (a[l]>a[l + 1]) 45 { 46 swap(a[l], a[l + 1]); 47 } 48 } 49 } 50 cout << sum << endl; 51 return 0; 52 }
更多代码请进入:https://github.com/tomatoschool