SCAU 9504 面试

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太慢了,加上对二分查找早忘得七七八八,所以做起来还是没太大的信心,后来发现二分查找没有错,错得的是冒泡排序多加了一个!,这题算水水的过吧!

原文地址:https://www.cnblogs.com/liaoguifa/p/2783340.html