洛谷P1090题解-创新互联
这个题我第一次的想法就是把数据从小到大,然后依次合并,最后就能得到结果!
后来发现,虽然最小的两个合并,但是可能两个小的合并后的数据大于下一个,再次合并就是有问题的。因此要对得到后的数据进行排序再依次合并。
此时,如果用普通的数组和sort函数的话必定会超时,因此我们这里可以用到优先队列,下面附上一些用法。
#include//头文件
priority_queue//定义
priority_queue,greater>q;//升序队列
priority_queue,less>q;//降序队列
priority_queuea//此时默认为降序队列
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
之后本题就很好解决了,下面附上代码
#include#include
#includeusing namespace std;
const int N = 10005;
priority_queue, greater>a;
int main()
{
int n;
int c, x, y;
long long k = 0;
cin >>n;
for (int i = 1; i<= n; i++)
{
cin >>c;
a.push(c);
}
for (int i = 1; i<= n-1 ; i++)
{
x = a.top();
a.pop();
y = a.top();
a.pop();
a.push(x + y);
k += x + y;
}
cout<< k;
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前标题:洛谷P1090题解-创新互联
网页地址:http://scyanting.com/article/ceisoe.html