poj: 3253

这题一开始从大往小考虑是行不通的,这个时候从小到大考虑就很容易了。用一个priority_queue选出两个最小的值加到结果里再推回queue里,直到queue空为止。注意这里res要用long long,否则会wa。

注意priority_queue默认是从大到小排,要从小到大排需要用greater<T>来规定,如果是自己定义的class,需要在class里定义cmp。

 1 #include <iostream>

 2 #include <queue>

 3 

 4 using namespace std;

 5 

 6 int main() 

 7 {

 8     priority_queue<int, vector<int>, greater<int> > S;

 9     int n;

10     cin >> n;

11     long long w;

12     for (int i = 0; i < n; i++) {

13         cin >> w;

14         S.push(w);

15     }

16     long long res = 0;

17     long long tmp = 0;

18     while (1) {

19         tmp += S.top();

20         S.pop();

21         if (S.empty()) break;

22         tmp += S.top();

23         S.pop();

24         if (S.empty()) break;

25         res += tmp;

26         S.push(tmp);

27         tmp = 0;

28     }

29     res += tmp;

30     cout << res << endl;

31     return 0;

32 }

你可能感兴趣的:(poj)