2017京东校招笔试题

181 篇文章 0 订阅
112 篇文章 0 订阅

题目内容来自牛客网https://www.nowcoder.com/ta/2017test

1、进制均值

题目描述

尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题,现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示为三位数1、7、3,按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11,。 小B感兴趣的是,一个数A如果按2到A-1进制表达时,各个位数之和的均值是多少?她希望你能帮她解决这个问题? 所有的计算均基于十进制进行,结果也用十进制表示为不可约简的分数形式。

输入描述:

输入中有多组测试数据,每组测试数据为一个整数A(1 ≤ A ≤ 5000).

输出描述:

对每组测试数据,在单独的行中以X/Y的形式输出结果。

示例1

输入

5
3

输出

7/3
2/1

编程思路:模拟,直接进制转换以及求最大公约数。

AC code:

#include<bits/stdc++.h>

using namespace std;

int numToSum(int x,int a)
{
    int s=0;
    while(x)
    {
        s+=x%a;
        x/=a;
    }
    return s;
}

int gcd(int a,int b)//也可以直接调用系统库函数__gcd(int,int)来做
{
    if(a<b)
        swap(a,b);
    if(b==0)
        return a;
    else
        return gcd(b,a%b);
}

int main()
{
    int A,i;
    while(cin>>A)
    {
        int sum=0;
        for(i=2;i<A;i++)
        {
            sum+=numToSum(A,i);
        }
        //int t=gcd(sum,A-2);
        int t = __gcd(sum,A-2);
        //cout<<sum/t<<"/"<<(A-2)/t<<endl;
        printf("%d/%d\n",sum/t,(A-2)/t);
    }
    return 0;
}

 

2、集合

题目描述

给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素。

输入描述:

每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集合B的元素个数。后两行分别表示集合A和集合B。每个元素为不超过int范围的整数,每个元素之间有个空格隔开。

输出描述:

针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开,行末无空格。

示例1

输入

3 3
1 3 5
2 4 6

输出

1 2 3 4 5 6

编程思路:利用C++的STL容器里的集合set即可实现。

AC code:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int n,m,a,b,i;
    set<int>S;
    while(cin>>n>>m)
    {
        for(i=1;i<=n;i++)
        {
            cin>>a;
            S.insert(a);
        }
        for(i=1;i<=m;i++)
        {
            cin>>b;
            S.insert(b);
        }
        for(auto &x:S)
        {
            if(x!=*S.rbegin())
            {
                cout<<x<<" ";
            }
            else
            {
                cout<<x<<endl;
            }
        }
    }
    return 0;
}

 

3、通过考试

题目描述

小明同学要参加一场考试,考试一共有n道题目,小明必须做对至少%60的题目才能通过考试,考试结束后,小明估算出每题做对的概率,p1,p2,……pn。你能帮他算出通过考试的概率吗?

输入描述:

输入第一行一个数n(1 ≤ n ≤ 100),表示题目的个数。第二行n个整数,p1,p2,……pn。表示小明有pi%的概率做对第i题。(0<=pi<=100)

输出描述:

小明通过考试的概率,最后结果四舍五入,保留小数点后五位。

示例1

输入

4
50 50 50 50

输出

0.31250

Hint

第一个样例中,每道题做对的概率都是0.5,想要通过考试至少要做对三题。所以最后答案就是(\binom{4}{3}+\binom{4}{4})x 0.5^4=5/16

 

编程思路:动态规划。

记前i道题中做对j道的概率为dp[i][j],则状态转移方程为:

dp[i][j]=dp[i-1][j]*(100-p[i])/100.0+dp[i-1][j-1]*(p[i])/100.0

从而可以求出前n道题中至少做对%60的题目的概率。

 

AC code:

#include<bits/stdc++.h>

using namespace std;

const int maxn = 100+5;

double dp[maxn][maxn];
int p[maxn];

int main()
{
	int i,j,n,m;
	double ans;
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>p[i];
	memset(dp,0,sizeof(dp));
	dp[0][0]=1;
	for(i=1;i<=n;i++)
	{
		dp[i][0]=dp[i-1][0]*(100-p[i])/100.0;
		for(j=1;j<=i;j++)
		{
			dp[i][j]=dp[i-1][j]*(100-p[i])/100.0+dp[i-1][j-1]*(p[i])/100.0;
		}
	}
	m=(n*3+4)/5;
	ans=0;
	for(i=m;i<=n;i++)
	{
		ans+=dp[n][i];
	}
	printf("%.5f\n",ans);
	return 0;
}

 

4、异或

题目描述

输入两个n位二进制数,输出它们异或结果的十进制答案。

输入描述:

输入第一行一个数n(1 ≤ n ≤ 20),接下来两行有两个n位二进制数,输入二进制数可能有前导零。

输出描述:

异或结果的十进制。

示例1

输入

4
1100
0100

输出

8

编程思路:先将二进制转成十进制,然后再进行异或运算即可。

AC code:

#include<bits/stdc++.h>

using namespace std;


int solve(string s)
{
	int i,x;
	x=0;
	for(i=0;i<s.length();i++)
	{
		x=x*2+(s[i]-'0');
	}
	return x;
}

int main()
{
	int n,a,b;
	string s1,s2;
	cin>>n;
	cin>>s1>>s2;
	a=solve(s1);
	b=solve(s2);
	printf("%d\n",a^b);
	return 0;
}

 

5、拍卖产品

题目描述

输入两个n位二进制数,输出它们异或结果的十进制答案。公司研发一种产品,共生产了n件。有m个客户想购买此产品,第i个客户出价Yi元。公司决定以一个固定价格出售产品,每一个出价不低于要价的客户将会以公司价格购买一件产品,余下的将会被拒绝购买。请找出能让公司利润最大化的售价。如果有各种定价方案可以最大化总收入,输出最小的定价。

 

输入描述:

输入第一行二个整数n(1 ≤ n ≤ 1000),m(1<=m<=1000),分别表示产品数和客户数。接下来第二行m个整数Vi(1<=Vi<=1000000),分别表示第i个客户的出价。

输出描述:

输出能让公司利润最大化的最小售价。

示例1

输入

5 4
2 8 10 7

输出

7

编程思路:排序加判断。

AC code:

#include<bits/stdc++.h>

using namespace std;

int V[1010];

int main()
{
	int n,m,i,sum,maxp,ans;
	cin>>n>>m;
	for(i=1;i<=m;i++)
		cin>>V[i];
	sort(V+1,V+m+1);
	maxp=0;
	for(i=1;i<=m;i++)
	{
		if(n>=m-i+1)
		{
			sum=V[i]*(m-i+1);
		}
		else
		{
			sum=V[i]*n;
		}
		if(sum>maxp)
		{
			maxp=sum;
			ans=V[i];
		}
	}
	cout<<ans<<endl;
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值