基于堆来实现贪心
用的是stl中的堆。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4 + 10;
int a[N];
int n;
int main(){
cin >> n;
priority_queue<int,vector<int>,greater<int>> heap;
for(int i = 0; i < n; i++){
cin >> a[i];
heap.push(a[i]);
}
int sum = 0;
while(heap.size() >= 2){
int a = heap.top();
heap.pop();
int b = heap.top();
heap.pop();
sum += (a + b);
heap.push(a + b);
}
cout << sum << endl;
return 0;
}
视图基于前缀和实现贪心
这个只能过acw的两个样例,但在蓝桥杯的谈判,感觉思路与合并果子一样,但下面代码能过蓝桥杯的(可能他水),但不能过合并果子。
#include <iostream>
#include <algorithm>
#include <cmath>
// #includ
using namespace std;
typedef long long ll;
const int N = 1e4 + 10;
int a[N];
int n;
ll ans;
int main()
{
// 请在此输入您的代码
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
sort(a,a + n);
for(int i = 1; i < n; i++){
// ans += a[i - 1] + a[i];
// printf("%d; ans=%d,a[%d] = %d,a[%d]=%d\n",i,ans,i-1,a[i-1],i,a[i]);
a[i] += a[i - 1];
ans += (1ll)* a[i];
}
cout << ans << endl;
return 0;
}