洛谷P1090 合并果子

这道题只需要把最小的两个果堆加起来就可以了,好多大佬都用的是优先队列,但由于本人太菜,只好用数组做。

如果这样想,那么每合并一次都需要排一次序,但事实上并不需要这么做(而且这样会超时,我之前用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

posted @ 2018-08-30 10:50  zxfzxf  阅读(185)  评论(0编辑  收藏  举报