1171.合并果子
Description
Input
Output
Sample Input
3 1 2 9
Sample Output
15
使用优先队列,可以保证数字始终有序排列,
1, 可以默认大到小排序,只不过利用相反数 ,看代码
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int main()
{
priority_queue<int>q;///优先队列
int n, i;
int a[10005];
scanf("%d", &n);
for( i =0; i<n; i++)
{
scanf("%d", &a[i]);
q.push( -a[i]);
}
int sum =0 ;
while( !q.empty())
{
int s1 = q.top();
q.pop();
if( q.empty())
break;
int s2 = q.top();
q.pop();
sum = sum -s1-s2;
q.push( s1+s2 );
}
printf("%d\n", sum);
return 0;
}
2 也可以重新排序,这个我也刚会
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
struct cmp{
bool operator()(int x,int y)
{
return x>y; ///从小到大排序。即x小的优先级高。
}
};
int main()
{
priority_queue<int,vector<int>,cmp>q;///优先队列
int n, i;
int a[10005];
scanf("%d", &n);
for( i =0; i<n; i++)
{
scanf("%d", &a[i]);
q.push( a[i]);
}
int sum =0 ;
while( !q.empty())
{
int s1 = q.top();
q.pop();
if( q.empty())
break;
int s2 = q.top();
q.pop();
sum = sum +s1+s2;
q.push( s1+s2 );
}
printf("%d\n", sum);
return 0;
}
希望可以帮到你啦。谢谢观看!!