华农acm:Scau 9504 面试

7 篇文章 0 订阅
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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值