【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 : 偶像的條件】
【連結】:https://hihocoder.com/contest/offers15/problems 【題目描述】: 題目1 : 偶像的條件 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Hi的學校正面臨著廢
[Offer收割]程式設計練習賽29 題目1 : 逃離迷宮4
描述 小Hi被壞女巫抓進一座由無限多個格子組成的矩陣迷宮。 小Hi一開始處於迷宮(x, y)的位置,迷宮的出口在(a, b)。小Hi發現迷宮被女巫施加了魔法,假設當前他處在(x, y)的位置,那麼他只能移動到(x+y, y)或者(x, x+y)的位置上。 小Hi想知道自己能不能逃離迷宮。 輸入 第一行包
【[Offer收割]程式設計練習賽15-B分數調查】
【連結】https://hihocoder.com/contest/offers15/problems 【題目描述】 題目2 : 分數調查 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Hi的學校總共有N名學生,
[Offer收割]程式設計練習賽27:題目2 : 兩個機器人
描述 一個N × M的2D迷宮中有兩個機器人。機器人A在迷宮左上角,只能向右或向下移動;機器人B在迷宮右下角,只能向左或向上移動。機器人不能移動到迷宮外。此外,由於奇怪的同步機制,這兩個機器人只能同時向相反的方向移動。也就是說或者機器人A向右同時機器人B向左;或者機器人A向下同時機器人B向上移動。 迷
【[Offer收割]程式設計練習賽13 D】騎士遊歷(矩陣快速冪模板)
題意: 描述 在8x8的國際象棋棋盤上給定一隻騎士(俗稱“馬”)棋子的位置(R, C),小Hi想知道從(R, C)開始移動N步一共有多少種不同的走法。 輸入 第一行包含三個整數,N,R和C。 對於40%的資料, 1 <= N <= 10
[offer收割]程式設計練習賽3-題目2:機會渺茫
描述 小Hi最近在追求一名學數學的女生小Z。小Z其實是想拒絕他的,但是找不到好的說辭,於是提出了這樣的要求:對於給定的兩個正整數N和M,小Hi隨機選取一個N的約數N',小Z隨機選取一個M的約數M',如果N'和M'相等,她就答應小Hi。 小Z讓小Hi去編寫這個隨機程式,到時候她review過沒有問題了就可以
HiHoCoder #1270 : 建造基地 [Offer收割]程式設計練習賽1 【完全揹包】
描述 在遙遠的未來,小Hi成為了地球聯邦外空間聯合開發工作組的一員,前往一顆新發現的星球開發當地的重金屬資源。 為了能夠在當地生存下來,小Hi首先要建立一個基地。建立基地的材料可以直接使用當地的石材和富裕的重金屬資源。基地建設分為N級,每一級都需要達成K的建設值後才能夠完成建設,當前級別的建設值溢位後不會
[Offer收割]程式設計練習賽1 hihocoder 1270 建造基地 (完全揹包)
時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 在遙遠的未來,小Hi成為了地球聯邦外空間聯合開發工作組的一員,前往一顆新發現的星球開發當地的重金屬資源。 為了能
九宮(DFS)——hiho [Offer收割]程式設計練習賽1
描述 小Hi最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重複的填入一個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。 三階幻方又被稱作九宮格,在小學奧數裡有一句非常有名的口訣:“二四為肩,六八為足,左三右七,戴九履一,五居其中”,通過這樣
[Offer收割]程式設計練習賽79——字母去重
[Offer收割]程式設計練習賽79——字母去重 題目 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個字串S,每次操作你可以將其中任意一個字元修改成其他任意字元。 請你計算最少需要多少次操作,才能使得S中不存在兩個相鄰的相同字元。
hihoCoder [Offer收割]程式設計練習賽83 D 生成樹問題
題目 從 Kruskal 演算法的角度來思考這個問題。 考慮 $n$ 個點的“空圖”(即沒有邊的圖)。 先將 $m_2$ 條無權值的邊加到圖中,得到一個森林。 將 $m_1$ 條有權值的邊按權值從小到大排序。 列舉這些邊,對於邊 $e\colon(u, v, w)$,若將 $e$ 加入圖中之後 (i)
[Offer收割]程式設計練習賽84 -- 括號序列
時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個只包含'(', ')'和''的字串S,現在小Hi可以任意指定''為'('或')',不同的'*'可以是不同的字元。 請你判斷小Hi是否可能得到一個合法匹配的字串。 輸入 第一行包含一個整數T,代表資料的組數。 以
hihoCoder 1285 [Offer收割]程式設計練習賽3-3
[Offer收割]程式設計練習賽3——第3題 這次練習賽感覺比前兩次練習賽簡單一點,第1第2題就不說了。 #1285 : 智力競賽 時間限制: 5000ms 單點時限: 1000ms
[Offer收割]程式設計練習賽9 B題 水陸距離
題目2 : 水陸距離 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個N x M的01矩陣,其中1表示陸地,0表示水域。對於每一個位置,求出它距離最近的水域的距離是多少。 矩陣中每個位置與它上下左右相鄰的格
[Offer收割]程式設計練習賽2 hihocoder 1275 掃地機器人 (計算幾何+模擬 比較煩)
時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Ho最近買了一臺掃地機器人用來代替他清掃實驗室的衛生,掃地機器人有不同的尺寸,但是通常來說可以被視作一個M*M的正方形,掃地機器人僅能清掃被自己覆蓋過的區域。 小Ho所在的實驗室是一個
[Offer收割]程式設計練習賽49
A.相似顏色 每兩位列舉一下0~15,更新一下就好了。。 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,a,b)
[Offer收割]程式設計練習賽56:卡片遊戲
#include<bits/stdc++.h> #include <assert.h> using namespace std; const int maxn = 1e5+11
[Offer收割]程式設計練習賽3
/** * ----------------------------------------------------------------- * Copyright (c) 2016 crazyacking.All rights reserved. * ---------------------------
hihocoder [Offer收割]程式設計練習賽19
題目1 : 大禮堂地毯 列舉 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std;
[Offer收割]程式設計練習賽4
#include <iostream> #include <string.h> #include <string> using namespace std; int main() { int n,x; int a[25]; cin >&