洛谷P1090讲解

1 篇文章 0 订阅
1 篇文章 0 订阅

蒟蒻想在洛谷上发这题的题解,但是不敢······

于是找到了这里。

废话不多说,开始!

1st:queue与vector

vector数组的用法

注明:文章中的vector用法并不全,详细介绍请点击此链接:水亦心的博客

简介

vector是C++库中所包含的一个数组类型,在无法确定数组有多大时,他就登场

当然,vector也有数据范围,暂时咱们不用管。

#include<vector>    //头文件
using namespace std;
vector<int> a;    //vector<数据类型> 数组名称;

vector数组的几种用法

vec.push_back(5);//数组名称.push_back(和此数组同类型的变量或数据)
vec.pop_back();//数组名称.pop_back();删除数组的最后一个
vec.begin();//数组名称.begin()该数组的第一个
vec.size();//数组名称.size()数组的长度
vec.erase(5);//数组名称.erase(想要删除数组的第几个)
vec.clear();//数组名称.clear()清空数组
vec.insert(i+1,a);//数组名称.insert(第几个元素的前面,插入的数据)插入

queue的用法

转载自:KEPROM的博客

版权声明:本文为CSDN博主「KEPROM」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

一、定义
queue是一种容器转换器模板,调用#include< queue>即可使用队列类。

一、queue初始化
queue<Type, Container> (<数据类型,容器类型>)
初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型

初始化示例
1:

queue<int>q1;
queue<double>q2;  
queue<char>q3;
//默认为用deque容器实现的queue;

2:

queue<char, list<char>>q1;
//用list容器实现的queue 

queue<int, deque<int>>q2;
 //用deque容器实现的queue 

注意:不能用vector容器初始化queue
因为queue转换器要求容器支持front()、back()、push_back()及 pop_front(),说明queue的数据从容器后端入栈而从前端出栈。所以可以使用deque和list对queue初始化,而vector因其缺少pop_front(),不能用于queue。

二、queue常用函数
1.常用函数

1.push() 在队尾插入一个元素
2.pop() 删除队列第一个元素
3.size() 返回队列中元素个数
4.empty() 如果队列空则返回true
5.front() 返回队列中的第一个元素
6.back() 返回队列中最后一个元素
2.函数运用示例
1:push()在队尾插入一个元素

queue <string> q;
    q.push("first");
    q.push("second");
    cout<<q.front()<<endl;

输出 first

2:pop() 将队列中最靠前位置的元素删除,没有返回值

queue <string> q;
    q.push("first");
    q.push("second");
    q.pop();
    cout<<q.front()<<endl;

输出 second 因为 first 已经被pop()函数删掉了

3:size() 返回队列中元素个数

  queue <string> q;
       q.push("first");
       q.push("second");
       cout<<q.size()<<endl;

输出2,因为队列中有两个元素

4:empty() 如果队列空则返回true

queue <string> q;
    cout<<q.empty()<<endl;
    q.push("first");
    q.push("second");
    cout<<q.empty()<<endl;

分别输出1和0
最开始队列为空,返回值为1(ture);
插入两个元素后,队列不为空,返回值为0(false);

5:front() 返回队列中的第一个元素

queue <string> q;
    q.push("first");
    q.push("second");
    cout<<q.front()<<endl;
    q.pop();
    cout<<q.front()<<endl;

第一行输出first;
第二行输出second,因为pop()已经将first删除了

6:back() 返回队列中最后一个元素

queue <string> q;
q.push("first");
q.push("second");
cout<<q.back()<<endl;

输出最后一个元素second

2nd:P1090详解

想复制代码?NoNoNo!先看看怎么做!!!

我用纯数组试了一下...

#include<iostream>
#include<algorithm>
using namespace std;
int a[10001];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	long long sum=0;
	sort(a+1,a+n+1);
	for(int i=2,j;i<=n;i++){
		a[i]+=a[i-1];
		a[0]=a[i];
		for(j=i+1;j<n&&a[j]<a[0];j++){
			a[j-1]=a[j];
		}
		a[j-1]=a[0];
		sum+=a[0];
	}
	cout<<sum<<endl;
	return 0;
}

测试结果:

测试结果

再用vector试试...

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> un;
int x[100001];
int main(){
	int n;
	long long sum=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>x[i];
	}
	sort(x,x+n);
	for(int i=0;i<n;i++){
		un.push_back(x[i]);
	}
	while(un.size()>1){
		int x,y;
		x=un[0];
		un.erase(un.begin());
		y=un[0];
		sum=sum+x+y;
		un.erase(un.begin());
		un.push_back(x+y);
	}
	cout<<sum<<endl;
	return 0;
}

测试结果:

测试结果

崩溃了...

A Day Later...

我活着回来了!!!

仔细钻研了半天...发现...要用queue!!!

上代码!!!

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
priority_queue<int, vector<int>, greater < int>> heap;
int main(){
    int n;
    cin>>n;
    while (n--){
        int x;
        cin>>x;
        heap.push(x);
    }
    int res = 0;
    while (heap.size() > 1){
        int a = heap.top();
        heap.pop();
        int b = heap.top();
        heap.pop();
        res += a + b;
        heap.push(a + b);
    }
    cout<<res<<endl;
    return 0;
}

AAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCCCCCCCCCCCCCCCCCC!!!

最后,朋友评论说:真“详解”。

如果喜欢,给个赞呗。

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值