9504 面试
时间限制:2000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC
Description
近来acm各大神牛教主均已经拿到超级offer(腾讯、网易、迅雷、阿里巴巴,百度……),无限膜拜。
小菜Arokenda因平时不学无术,已经成为华农新一届面霸,记录正在不断刷新。经过2^n次面试,哥总结出,有80%的公司都会问你期望薪水为多少。
当然,他们公司原定计划都有N多不同金额的薪水,会根据你期望的薪水找到一份与你最匹配的薪水(即最接近你期望的薪水),
当然,能否拿到必需至少具备有此二条件其中之一:
1、你是华农acmer且成为教主级人物。
2、你的忽悠能力灰常强。#^_^#
输入格式
第一行为T(T<20),表示有T个公司。
接下来每个公司第一行为整数n(n<5000),表示该公司提供了n份金额不同的薪水。
第二行为n个整数,表示这n份不同的薪水。
第三行为整数m(m<5000),表示有m个人去面试。
第四行为m个整数,表示这m个人的期望薪水。
输出格式
对每个人输出一行,表示公司提供的最接近该面试者期望薪水的薪水。
每个公司之间用空行隔开。
输入样例
2
5
1 2 3 4 5
3
2 4 6
5
1 2 3 4 5
3
2 4 6
输出样例
2
4
5
2
4
5
提示
面对同样接近的两份薪水,该公司会提供低薪水的职位给你,以节省经费。
公司提供的薪水和面试者的期望薪水都是无序的。
来源 Arokenda
作者 a470086609
题解:
这题其实很简单,数据范围使得这题即使使用暴力也是不会出错的,所以呢我就使用了暴力
先排序公司提供的工资,使得这样小的工资出现在前面,在相等差距的情况下优先选择小的工资
接着在每一个员工的理想工资的工资和每一个公司提供的工资进行做差对比找出最小值。
暴力算法Code:用时136ms
#ifdef local
#include <ctime>
#endif
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define rep(i,e) for(int i=0;i<e;i++)
#define rep1(i,e) for(int i=1;i<=e;i++)
#define repx(i,x,e) for(int i=x;i<=e;i++)
#define ll long long
#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define test(a) cout<<a<<endl
#define test2(a,b) cout<<a<<" "<<b<<endl
#define test3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl
typedef unsigned long long ull;
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10;
int k;
int n, m;
int s[N];
int p[N];
void work(){
scd(n);
for(int i =0;i<n;i++){
scd(s[i]);
}
scd(m);
sort(s,s+n);
for(int i=0;i<m;i++){
scd(p[i]);
int minv=inf;
int pos=0;
for(int j=0;j<n;j++){
if(minv>abs(p[i]-s[j])){
minv=abs(p[i]-s[j]);
pos=j;
}
}
printf("%d\n",s[pos]);
}
printf("\n");
}
int main() {
#ifdef local
freopen("in.txt", "r", stdin);
freopen("out", "w", stdout);
clock_t t_begin = clock();
#endif
int t;
scd(t);
while (t--) {
work();
}
#ifdef local
clock_t t_end = clock();
double time = (t_end - t_begin) / (double)(CLOCKS_PER_SEC);
printf("\n\n\nTime_used=%.10lf", time);
#endif
}
二分Code: 用时68ms
#ifdef local
#include <ctime>
#endif
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define rep(i,e) for(int i=0;i<e;i++)
#define rep1(i,e) for(int i=1;i<=e;i++)
#define repx(i,x,e) for(int i=x;i<=e;i++)
#define ll long long
#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define test(a) cout<<a<<endl
#define test2(a,b) cout<<a<<" "<<b<<endl
#define test3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl
typedef unsigned long long ull;
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;
int len[N];
void work() {
int n;
scd(n);
for(int i =0;i<n;i++){
scd(len[i]);
}
int m;
scd(m);
sort(len,len+n);
len[n]=inf;
int t;
for(int i =0;i<m;i++){
scd(t);
int pos=lower_bound(len,len+n,t)-len;
if(pos==0){
printf("%d\n",len[pos]);
}else{
if(abs(len[pos]-t)>=abs(len[pos-1]-t)){
printf("%d\n",len[pos-1]);
}else{
printf("%d\n",len[pos]);
}
}
}
printf("\n");
}
int main() {
#ifdef local
//freopen("in.txt", "r", stdin);
//freopen("out", "w", stdout);
clock_t t_begin = clock();
#endif
int t;
scd(t);
while(t--)
work();
#ifdef local
clock_t t_end = clock();
double time = (t_end - t_begin) / (double)(CLOCKS_PER_SEC);
printf("\n\n\nTime_used=%.10lf", time);
#endif
}
加上输入挂算法Code:100ms,可能是因为数据量太小
#ifdef local
#include <ctime>
#endif
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define rep(i,e) for(int i=0;i<e;i++)
#define rep1(i,e) for(int i=1;i<=e;i++)
#define repx(i,x,e) for(int i=x;i<=e;i++)
#define ll long long
#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define test(a) cout<<a<<endl
#define test2(a,b) cout<<a<<" "<<b<<endl
#define test3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl
typedef unsigned long long ull;
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;
int len[N];
template <class T>
inline bool scd(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF)return 0;
while (c != '-' && (c < '0' || c > '9'))c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0' && c <= '9')ret = ret * 10 + (c - '0');
ret = ret * sgn;
return 1;
}
void work() {
int n;
scd(n);
for(int i =0;i<n;i++){
scd(len[i]);
}
int m;
scd(m);
sort(len,len+n);
len[n]=inf;
int t;
for(int i =0;i<m;i++){
scd(t);
int pos=lower_bound(len,len+n,t)-len;
if(pos==0){
printf("%d\n",len[pos]);
}else{
if(abs(len[pos]-t)>=abs(len[pos-1]-t)){
printf("%d\n",len[pos-1]);
}else{
printf("%d\n",len[pos]);
}
}
}
printf("\n");
}
int main() {
#ifdef local
//freopen("in.txt", "r", stdin);
//freopen("out", "w", stdout);
clock_t t_begin = clock();
#endif
int t;
scd(t);
while(t--)
work();
#ifdef local
clock_t t_end = clock();
double time = (t_end - t_begin) / (double)(CLOCKS_PER_SEC);
printf("\n\n\nTime_used=%.10lf", time);
#endif
}