[hihoCoder]1514_偶像的条件

链接:https://hihocoder.com/problemset/problem/1514

题意:偶像的条件

给定三个数组A,B,C,从中各挑出一个数a,b,c,使得D=|a-b|+|b-c|+|c-a|最小,输出最小的D



题解:

不那么水的水题 ( 啪 x )

考虑一下数学,给x,y,z,不妨设 x>y>z,那么

  D=|x-y|+|y-z|+|z-x|=(|x-y|+|y-z|)+|x-z|=(x-y+y-z)+|x-z|= 2 * | x - z |

实际上就变成了在这三个数组找出一个最大值,剩余两个数组中找出一个最小值,然后最后一个数组里必须有元素位于最大值与最小值之间,想办法使得找到的最大值和最小值尽可能小就好了

那么就枚举好了,假设挑出的元素按照大小顺序,他们所属的集合可能是 ABC ACB BAC BCA CAB CBA

用min表示最小的那个结果(初始化为无穷)

对第一个:枚举A中的所有值作为最大值,比如a,通过在C中枚举所有小于等于a的值作为最小值,然后查找看看B中存不存在 b 使得 c<=b<=a,如果有,而且a-c<min,那么更新min就好了

剩下的也类似

比较方便的查找的方法(有序情况下)可以考虑使用二分查找,时间复杂度是O(logN)的,快得一批

#include<cstdio>
#include<cmath>
#include<cctype>
#include<cstring>
#include<iostream>
#include<string>
#include<sstream>
//stringstream ss(line)
#include<algorithm>
//sort(a,a+n,cmp)
//p=lower_bound(a,a+n,x)-a+1(大于或等于x的第一个位置)
#include<vector>
#include<bitset>
//bitset<N> xx

using namespace std;

const int U=3;
const int INF = 1e8;
vector<int>	save[U];
int LEN[U];

void print(){
	for(int i=0;i<U;i++){
		printf("\n*******\n");
		for(int j=0;j<LEN[i];j++){
			printf("%d ",save[i][j]);
		}
	}
	return ;
}

int main(){
	for(int i=0;i<U;i++)	scanf("%d",LEN+i);
	int d,d1,d2,d3;
	vector<int>::iterator pos;
	for(int i=0;i<U;i++){
		for(int j=0;j<LEN[i];j++){
			scanf("%d",&d);
			//pos = lower_bound(save[i].begin(),save[i].end(),d);
			//save[i].insert(pos,d);
			save[i].push_back(d);
		}
		sort(save[i].begin(),save[i].end());
	}
	//print();
	int min = INF;
	for(int i=0;i<U;i++){				//max
		for(int j=0;j<U;j++){			//min
			if(j==i)	continue;
			int k=3-i-j;
			for(int ii=LEN[i]-1;ii>=0;ii--){
				d1 = save[i][ii];
				int jj = lower_bound(save[j].begin(),save[j].end(),d1-min)-save[j].begin();
				int jjj = lower_bound(save[j].begin(),save[j].end(),d1)-save[j].begin();
				for(;jj<=jjj;jj++){
					d2 = save[j][jj];
					if(d2>d1) continue;
					d = lower_bound(save[k].begin(),save[k].end(),d2) - save[k].begin();
					d3 = save[k][d];
					if(d3<=d1&&d3>=d2){
						if(min>d1-d2){
							//printf("i=%d,j=%d,d1=%d,d2=%d,d3=%d\n",i,j,d1,d2,save[k][d]);
							min = d1-d2;
						}
					}
				}
			}
		}
	}
	printf("%d",min*2);
	return 0;
}

  



其实本来一开始想用线段树维护的,不过自从发现CF找中间值那道题可以用vector+lower_bound()来做之后现在都不怎么想宠幸线段树了=_=想想还是用二分吧。。

时间: 2024-12-14 04:08:02

[hihoCoder]1514_偶像的条件的相关文章

HihoCoder - 1514 偶像的条件

时间限制: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, A

[Offer收割]编程练习赛15 A.偶像的条件[贪心]

#1514 : 偶像的条件 时间限制: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. 第

hihocoder #1190 : 连通性&#183;四 点双联通分量

http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho. 老师告诉小Hi和小Ho:之前的分组出了点问题,当服务器(上次是连接)发生宕机的时候,在同一组的服务器有可能连接不上,所以他们希望重新进行一次分组.这一次老师希望对连接进行分组,并把一个组内的所有连接关联的服务器也视为这个组内

hihoCoder 1393 网络流三&#183;二分图多重匹配(Dinic求二分图最大多重匹配)

#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选手参加. 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加

hihocoder 编程练习赛23

第一题:H国的身份证号码I 题意:一个N位的正整数(首位不能是0).每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K.按从小到大的顺序输出所有合法的N位号码,每个号码占一行. 思路:dfs #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N = 20; #define LL long long int n, k, a[N]; void

hihocoder 1496:寻找最大值(高维前缀最大次大值)

[题目链接] https://hihocoder.com/problemset/problem/1496 [题目大意] 给定N个数A1, A2, A3, ... AN, 从中找到两个数Ai和Aj(i≠j)使得乘积Ai*Aj*(Ai&Aj)最大 [题解] 我们可以枚举x&y的结果z,找出两个数x&y==z使得x*y最大,更新答案即可, 条件可以被削弱为z为x&y的子集,这种条件放缩不会导致最优解的丢失, z为x&y的子集等价于z为x的子集并且z为y的子集. 那么我们只

[hihocoder 1249 Xiongnu&#39;s Land]线性扫描

2015区域赛北京赛区的三水,当时在赛场上没做出的原因是复杂度分析不正确导致把方法想复杂了.近来复习复杂度分析,觉得不能只是笼统地看渐进复杂度(big-O),更应根据算法的伪码计算真正的以基本操作数为变量的时间复杂度T(n). 题意:在二维坐标系第一象限中,将一块顶点在原点边长为R的正方形土地用直线x=n一分为二,左侧分给Wei,右侧分给Huo. 土地中包含N个绿洲,每个绿洲是一个矩形,其位置和大小用四元组(L,T,W,H)表示,其中(L,T)为其左上方顶点的坐标,W,H为其宽度和高度.绿洲互不

Atitit 如何创新 创新只有在两种条件下发生:自由、效率。

创新是如何发生的呢? 创新只有在两种条件下发生:自由.效率.在自由的环境下,对效率的追逐等于创新.如果你不自由,你的思想不够开阔,你脑洞不够大,就无法创新.但如果只是脑洞够大,净搞些乱七八糟的也没什么用,还要再加上效率. 观察一下人类的历史,全部是对效率的提升:马车到汽车,还嫌不够快,飞机出来了,飞机不够快,火箭出来了.再来看通讯,以前飞鸽传书,后来电报,嫌不够快,电话也就出来了. 现在已经全面转向智能手机.今天推广渠道实在是太牛了,你要100万用户,马上就给弄.有好多三线城市的年轻人都不工作了

hihoCoder 1039:字符消除(字符串处理)

#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串.例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和