一道入门级贪心题,从大到小排序,序号逢3的倍数跳过进行累加操作就好。
#include<stdio.h> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int a[100005]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1,cmp); int sum=0; for(int i=1;i<=n;i++) { if(i%3==0) continue; else sum+=a[i]; } printf("%d\n",sum); }
也算是一道入门级贪心题,每次选队列中两个最小的数进行合并即可。
//这道题给我的感觉很像哈夫曼树。。
这里巧妙的运用到了优先队列,由于优先队列一开始即是栈顶元素是最小的,那我们在存数的时候进行取负操作,然后在累加的时候还原为正数就好。
#include<stdio.h> #include<algorithm> #include<queue> using namespace std; priority_queue<int>q; int x[10005],n,a,b; int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&x[i]); q.push(-x[i]); //变负,使本来大的数变小,让小的数优先操作 } int sum=0; while(q.size()!=1) { a=q.top(); q.pop(); b=q.top(); q.pop(); sum-=(a+b); //由于一开始存的是负数,所以用减变成正的 q.push(a+b); } printf("%d\n",sum); }