首页 > 其他分享 >思维题

思维题

时间:2024-05-21 13:42:34浏览次数:18  
标签:q1 思维 q2 int 队首 复杂度 排序

思维题

合并果子(加强版)

显然,每次都找最小的两个数合并。

在合并之后查最小数,这样的操作涉及

  • 添加
  • 删除
  • 全局最小

显然这是堆的模板。

但是发现这样的复杂度是 \(\mathcal{O(n\log n)}\) 的,不足以通过本题。所以考虑优化。

发现添加的数总是越来越大(单调不降)的,故你要考虑维护一个队列 \(q2\) 来存。

每次操作中,如果 \(q2\) 的队首 \(>\) \(q1\) 的队首,那么选择 \(q1.front\) ,反之亦然。

注意到 \(q1\) 只添不删,所以只要先排序就好了

然后维护两个队列就好了。

这时你发现了一个新的复杂度瓶颈:排序。

这样做要先让 \(q1\) 保持有序。注意到 \(\alpha\leq 10^5\) ,使用桶排序。

程式
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+10,alpha=1e5;
queue<int> q1,q2;
int n,x,ans;
int t[N];
inline int get(void){ 
	int x;
	if(q1.front()<q2.front() && !q1.empty() || q2.empty()) return x=q1.front(), q1.pop(), x;
	else return x=q2.front(), q2.pop(), x;
}
inline int read(void){
	char ch=0; int x=0;
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
	return x;
}
signed main(){
	n=read();
	for(int i=1;i<=n;++i) x=read(), ++t[x];
	for(int i=1;i<=alpha;++i) if(t[i]) while(t[i]--) q1.push(i);
	while(q1.size()+q2.size()!=1){
		int x=get()+get();
		ans+=x, q2.push(x);
	}
	return cout<<ans<<"\n",0;
}

标签:q1,思维,q2,int,队首,复杂度,排序
From: https://www.cnblogs.com/chihirofujisaki/p/18203805/smart

相关文章

  • 架构与思维:4大主流分布式算法介绍(图文并茂、算法拆解)
    0导读之前的文章中,我们介绍过分布式事务的基础知识,也了解了分布式场景下常见一致性问题和解决方案,对分布式锁和CAS模式有一定的了解,有兴趣的同学可以通过下面链接到作者的两篇相关文章。五种分布式事务解决方案(图文总结)高并发下的数据一致性保障(图文全面总结)1介绍本文聚......
  • 垂直关系转化思维导图
    前言使用方法:如果想得到更好的显示效果,可以点击全屏按钮,已经实现电脑端、手机端的适配,效果很好;电视端没有实现适配,Ipad端的适配没有测试;思维结构图全屏相关说明内容继续编辑完善中,源文件存放在draw.io上。......
  • 平行关系转化思维导图
    前言使用方法:如果想得到更好的显示效果,可以点击全屏按钮,已经实现电脑端、手机端的适配,效果很好;电视端没有实现适配,Ipad端的适配没有测试;思维结构图全屏......
  • 时代在发展,做信息化的思维也要变
    最近,跟踪了15个月的项目,预算2000万,最终投标失败。投标价是倒数第二低,中标方是投标价倒数第一低,中标价基本是预算的50%左右,中标单位还是一个行业内有名的企业。最近群友交流,反馈也是比较难做,如下图:我们回顾过去,原来的程序员开发程序按代码行数收费,原来会OFFICE就可......
  • 【反向思维】怎么判断面试者是否有扎实的前端基础?
    前鹅厂前端,待了4年,也算是个前端部分还有点复杂的项目的负责人。在鹅厂面试了几百人,慢慢总结了一下自己的经验,希望对求职的同学有帮助,反向思维及去准备。【技术大厂,前后端可投】我一般就问四个问题,主要还是引导让候选人自个发挥。1,问项目(40分)做过哪些项目,在其中怎么思考的。如果......
  • 一道思维题(有意思)
    U431308Maximum-Gap给你一个序列\(a\),求它排完序后的\(\max(\lverta_i-a_{i-1}\rvert)\),其实就是求一个序列排完序后的相邻元素的最大差值。样例:输入:\(n=4,a=[11,2,7,5]\)输出:\(4\)请你在不使用任何排序,值域很大的情况下以\(O(n)\)的复杂度解决这个问题。有想法......
  • 思维减负·系列:(七)重塑语言模式
          我们的语言模式对思维方式有着重要影响。重塑语言模式,避免使用消极、绝对化的语言,多使用积极乐观的语言表达,塑造积极心态,是远离过度思考和精神内耗的一个关键。      不要用恶毒的语言、负面的情绪和思维喂养自己的潜意识。对自己要有同情心,给自己美......
  • 读天才与算法:人脑与AI的数学思维笔记25_涌现理论
    1. 人工智能新闻1.1. 人工智能新闻报道算法的核心是如何将未经处理的原始数据转换成新闻报道1.2. 很少有记者为美联社决定使用机器来帮助报道这些新闻持反对意见1.2.1. 像“Wordsmith”这样的算法,具有自动化的洞察力、科学的叙事能力,现在正被应用于基于大量数据的分析报道......
  • 思维减负·系列:(五)放下完美主义
          完美主义会给人带来精神压力和内耗。我们要学会放下完美主义,允许自己犯错和不完美,摆脱完美主义的枷锁,避免给自己过大压力。      很多时候,我们给自己设定了过高的标准,希望事事完美无缺。但是我们要认识到作为人犯错是必然的,关键是要抓住大方向,小......
  • 软件测试思维1.1
    (1)需求测试需求:需求文档,制作的需求书(全称:软件需求规格说明书,简称:srs)需求:根据客户要实现一个功能;开发根据需求编写代码,测试也是根据需求编写测试用例和测试案例:测试制作水杯的说明书测试:需求是否合理,需求有没错别字,需求是否规范,需求是否具有唯一性等(2)界面测试界面测试也是......