9504 面试
时间限制:2000MS 内存限制:65535K 提交次数:0 通过次数:0
题型: 编程题 语言: 无限制
Description
近来acm各大神牛教主均已经拿到超级offer(腾讯、网易、迅雷、阿里巴巴,百度……),无限膜拜。 小菜Arokenda因平时不学无术,已经成为华农新一届面霸,记录正在不断刷新。经过2^n次面试,哥总结出,有80%的公司都会问你期望薪水为多少。 当然,他们公司原定计划都有N多不同金额的薪水,会根据你期望的薪水找到一份与你最匹配的薪水(即最接近你期望的薪水), 当然,能否拿到必需至少具备有此二条件其中之一: 1、你是华农acmer且成为教主级人物。 2、你的忽悠能力灰常强。#^_^#
Input
第一行为T(T<20),表示有T个公司。 接下来每个公司第一行为整数n(n<5000),表示该公司提供了n份金额不同的薪水。 第二行为n个整数,表示这n份不同的薪水。 第三行为整数m(m<5000),表示有m个人去面试。 第四行为m个整数,表示这m个人的期望薪水。
Output
对每个人输出一行,表示公司提供的最接近该面试者期望薪水的薪水。 每个公司之间用空行隔开。
Sample Input
2 5 1 2 3 4 5 3 2 4 6 5 1 2 3 4 5 3 2 4 6
Sample Output
2 4 5 2 4 5
Hint
面对同样接近的两份薪水,该公司会提供低薪水的职位给你,以节省经费。
公司提供的薪水和面试者的期望薪水都是无序的。
Source
Arokenda
Provider
a470086609
#include<stdio.h> #include<string.h> int salay[5000]; int main() { int i, j, mid, low, high, flag, T, t, saln, exn, temp; scanf("%d", &T); for(t=1; t<=T; ++t) { memset(salay, 0, sizeof(salay)); scanf("%d", &saln); for(i=0; i<saln; ++i) scanf("%d", &salay[i]); for(i=0; i<saln-1; ++i) { flag = 1; for(j=0; j<saln-1-i; ++j) if(salay[j] > salay[j+1]) { temp = salay[j]; salay[j] = salay[j+1]; salay[j+1] = temp; flag = 0; } if(flag) break; } scanf("%d", &exn); for(i=0; i<exn; ++i) { scanf("%d", &temp); low = 0, high = saln-1, mid = (low+high)/2; if(temp <= salay[low]) {printf("%d\n", salay[low]); continue;} else if(temp >= salay[high]) {printf("%d\n", salay[high]); continue;} for(; low<high; ) { if(salay[mid] > temp) {high = mid-1; mid = (high+low)/2;} else if(salay[mid] < temp){low = mid + 1; mid = (high+low)/2;} else break; } if(salay[mid] == temp) printf("%d\n", temp); else if(salay[mid] < temp) { if(temp-salay[mid] > salay[mid+1]-temp) printf("%d\n", salay[mid+1]); else printf("%d\n", salay[mid]); } else { if(temp-salay[mid-1] > salay[mid]-temp) printf("%d\n", salay[mid]); else printf("%d\n", salay[mid-1]); } } if(t != T) printf("\n"); } return 0; }
解题报告:
看题解答,注意hint,主要是熟悉了一下二分查找,OJ太慢了,加上对二分查找早忘得七七八八,所以做起来还是没太大的信心,后来发现二分查找没有错,错得的是冒泡排序多加了一个!,这题算水水的过吧!