贪心:P1090 合并果子[USACO06NOV] Fence Repair G(洛谷)

    技术2022-07-14  84

    本题对c++党来说有个福利 STL里的优先队列 : priority_queue 具体用法参考以下链接: priority_queue 本题链接

    #include<bits/stdc++.h> using namespace std; int n, ans = 0; priority_queue < int, vector <int>, greater <int> > q; int main() { cin >> n; for (int i = 1; i <= n; ++i) { int x; cin>>x; q.push(x); } while (q.size() > 1) { int x = q.top(); q.pop();//取第一小的堆,并将其删除 int y = q.top(); q.pop();//取第此时第一小的堆,并将其删除 ans += x + y; q.push(x + y);//将合并后的堆加入堆顶 } cout << ans << endl; return 0; }

    本题核心代码:

    while (q.size() > 1) { int x = q.top(); q.pop();//取第一小的堆,并将其删除 int y = q.top(); q.pop();//取第此时第一小的堆,并将其删除 ans += x + y; q.push(x + y);//将合并后的堆加入堆顶 }

    本题代码较为常见的错误为:

    #include<bits/stdc++.h> using namespace std; int a[1000]; int n;//果子堆数 int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a + n); int sum = a[0]; for (int j =0; j<n-1; j++) { a[j] += a[j + 1]; sum += a[j]; } cout << sum<< endl; return 0; }

    结果是对的,但使用sort函数会超时,优先队列为最优解。

    Processed: 0.014, SQL: 10