【Offer收割]编程练习赛15-题目1 : 偶像的条件】

2024-08-27 01:58

本文主要是介绍【Offer收割]编程练习赛15-题目1 : 偶像的条件】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【链接】:https://hihocoder.com/contest/offers15/problems
【题目描述】:
题目1 : 偶像的条件
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi的学校正面临着废校的大危机。面对学校的危机,小Hi同学们决定从ABC三个班中各挑出一名同学成为偶像。

成为偶像团体的条件之一,就是3名团员之间的身高差越小越好。

已知ABC三个班同学的身高分别是A1..AN, B1..BM 和 C1..CL。请你从中选出3名同学Ai, Bj, Ck使得D=|Ai-Bj|+|Bj-Ck|+|Ck-Ai|最小。

输入
第一行包含3个整数,N, M和L。

第二行包含N个整数,A1, A2, … AN。(1 <= Ai <= 100000000)

第三行包含M个整数,B1, B2, … BM。(1 <= Bi <= 100000000)

第四行包含L个整数,C1, C2, … CL。(1 <= Ci <= 100000000)

对于30%的数据, 1 <= N, M, L <= 100

对于60%的数据,1 <= N, M, L <= 1000

对于100%的数据,1 <= N, M, L <= 100000

输出
输出最小的D。

样例输入
3 3 3
170 180 190
195 185 175
180 160 200
样例输出
10
【思路】首先想到的是枚举第一个数组的元素,要使得满足差绝对值之和最小,那么就要在剩余数组中找到第一个大于等于第一个元素的位置,依次枚举,那么要不超时,自然用到STL的lower_bound()函数:
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。
代码如下:

/***********************
[Offer收割]编程练习赛15     【A偶像的条件】
Author:herongwei
Time:2017/4/23 19:23
language:C++
http://blog.csdn.net/u013050857
***********************/
#pragma comment(linker,"/STACK:102400000,102400000")
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <set>
#include <stack>
#include <math.h>
#include <map>
#include <queue>
#include <deque>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
const LL MOD = 999999997;
const int inf= 0x3f3f3f3f;
int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};/*Super waigua */
#define INLINE __attribute__((optimize("O3"))) inline
INLINE char NC(void)
{static char buf[100000], *p1 = buf, *p2 = buf;if (p1 == p2){p2 = (p1 = buf) + fread(buf, 1, 100000, stdin);if (p1 == p2) return EOF;}return *p1++;
}INLINE void read(int &x)
{static char c;c = NC();int b = 1;for (x = 0; !(c >= '0' && c <= '9'); c = NC()) if(c == '-') b = -b;for (; c >= '0' && c <= '9'; x = x * 10 + c - '0', c = NC());x *= b;
}
int an[maxn];
int am[maxn];
int al[maxn];
int n,m,l;
int ret=inf;
void init()
{int x,y,s;for(int i=1; i<=n; ++i) read(an[i]);for(int i=1; i<=m; ++i) read(am[i]);for(int i=1; i<=l; ++i) read(al[i]);sort(an+1,an+n+1);sort(am+1,am+m+1);sort(al+1,al+l+1);
}
int solve(int an[],int am[],int al[],int nn,int mm,int ll)
{/*循环第一个数组*/for(int i=1; i<=nn; ++i){/*找到第一个大于等于an[i]的元素位置*/int tm=lower_bound(am+1,am+mm+1,an[i])-am;if(tm<=mm) /*一定要注意判断条件!*/{/*找到第一个大于等于am[tm]的元素位置*/int tl=lower_bound(al+1,al+ll+1,am[tm])-al;if(tl<=ll){ret=min(ret,abs(al[tl]-an[i])*2);}}}return ret;
}
int get_solve(int an[],int am[],int al[],int n,int m,int l)
{solve(an,am,al,n,m,l);solve(an,al,am,n,l,m);solve(am,an,al,m,n,l);solve(al,an,am,l,n,m);solve(am,al,an,m,n,l);solve(al,am,an,l,m,n);
}
int main()
{// freopen("in.txt","r",stdin);while(~scanf("%d %d %d",&n,&m,&l)){init();printf("%d\n",get_solve(an,am,al,n,m,l));}return 0;
}

这篇关于【Offer收割]编程练习赛15-题目1 : 偶像的条件】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110313

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async