牛客网 之 百度2017春招笔试真题编程题集合(共5题)

来源:互联网 发布:怎么linux安装dhcp服务 编辑:程序博客网 时间:2024/04/28 10:46
1、
[编程题] 买帽子

时间限制:1秒

空间限制:32768K

度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少? 
输入描述:
首先输入一个正整数N(N <= 50),接下来输入N个数表示每顶帽子的价格(价格均是正整数,且小于等于1000)


输出描述:
如果存在第三便宜的帽子,请输出这个价格是多少,否则输出-1

输入例子:
1010 10 10 10 20 20 30 30 40 40

输出例子:
30
分析:压缩数组,用新数组保存,判断新数组长度是否大于等于3即可
AC代码如下:
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;const int maxn=50+1;int a[maxn],b[maxn];int main(){    int n,num=0;    cin>>n;    for(int i=0;i<n;i++) cin>>a[i];    sort(a,a+n);    for(int i=0;i<n;i++)    {        b[num]=a[i];        while(i+1<n && b[num]==a[i+1])        {            i++;        }        num++;    }    if(num>=3)        cout<<b[2]<<endl;    else        cout<<-1<<endl;    return 0;}


2、
[编程题] 度度熊回家

时间限制:1秒

空间限制:32768K

一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离? 
输入描述:
输入一个正整数N, N <= 50。接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于100


输出描述:
输出一个整数表示度度熊最少需要走的距离。

输入例子:
41 4 -1 3

输出例子:
4
分析:枚举忽略的点,并标记,用新数组存起来再做相应的操作
AC代码如下:
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;const int maxn=50+1;int fun(int s[],int t[],int n){    int sum=0,num=0;    int c[maxn];    for(int i=0;i<n;i++)    {        if(!t[i]){            c[num]=s[i];            num++;        }    }    for(int i=1;i<num;i++)    {        sum+=abs(c[i]-c[i-1]);    }    return sum;}int main(){    int a[maxn];    int b[maxn];    int n,mini=999999;    cin>>n;    for(int i=0;i<n;i++) cin>>a[i];    memset(b,0,sizeof(b));    for(int i=1;i<n-1;i++)    {        b[i]=1;        mini=min(mini,fun(a,b,n));        b[i]=0;    }    cout<<mini<<endl;    return 0;}
3、
[编程题] 寻找三角形

时间限制:1秒

空间限制:32768K

三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用'R', 'G', 'B'表示。 
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。 
输入描述:
首先输入一个正整数N三维坐标系内的点的个数.(N <= 50) 接下来N行,每一行输入 c x y z,c为'R', 'G', 'B' 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)


输出描述:
输出一个数表示最大的三角形面积,保留5位小数。

输入例子:
5R 0 0 0R 0 4 0R 0 0 3G 92 14 7G 12 16 8

输出例子:
6.00000
分析:因为要判断多个条件,所以分别写函数实现,求面积用海伦公式
AC代码如下:
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const int maxn=50+1;struct point{    char color;    int x;    int y;    int z;}po[maxn];double juli(point a,point b){    double sum;    sum=sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z) );    return sum;}double area(double a,double b,double c)  //求面积{    double p=(a+b+c)/2.0;    double s=sqrt(p*(p-a)*(p-b)*(p-c));    return s;}bool iscolor(point a,point b,point c)  //判断颜色{    if(a.color==b.color && b.color==c.color && a.color==c.color)        return true;    if(a.color!=b.color && b.color!=c.color && a.color!=c.color)        return true;    return false;}double isk(point a,point b,point c)  //是否是三角形{    double kx,ky,kz;    kx=juli(a,b);    ky=juli(a,c);    kz=juli(b,c);    if(kx<ky+kz && ky<kx+kz && kz<ky+kx)        return true;    return false;}int main(){    int n;    double maxn=-1.0;    cin>>n;    for(int i=0;i<n;i++)    {        cin>>po[i].color>>po[i].x>>po[i].y>>po[i].z;    }    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)            for(int k=0;k<n;k++)            {                if(i!=j && j!=k && i!=k)                {                    if(iscolor(po[i],po[j],po[k]))                    {                        if( isk(po[i],po[j],po[k]) )                        {                            maxn=max( maxn,area( juli(po[i],po[j]),juli(po[i],po[k]),juli(po[j],po[k]) ) );                        }                    }                }            }    printf("%.5lf\n",maxn);    return 0;}


4、
[编程题] 有趣的排序

时间限制:1秒

空间限制:32768K

度度熊有一个N个数的数组,他想将数组从大到小排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序? 
输入描述:
首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)


输出描述:
输出一个整数表示最少的操作次数。

输入例子:
419 7 8 25

输出例子:
2
分析:用原序列与排序(从小到大)后的序列比较,从头到尾,看有多少元素已经相对排序好了,即不需要移动,剩下的即为需要移动的
AC代码如下:
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn=50+1;int a[maxn],sorta[maxn];int main(){    int n;    int count=0;    cin>>n;    for(int i=0;i<n;i++){           cin>>sorta[i];           a[i]=sorta[i];    }    sort(sorta,sorta+n);    for(int i=0,j=0;i<n;i++)    {        if(a[i]==sorta[j])        {            count++;            j++;        }    }    cout<<n-count<<endl;    return 0;}

5、
[编程题] 不等式数列

时间限制:1秒

空间限制:32768K

度度熊最近对全排列特别感兴趣,对于1到n的一个排列,度度熊发现可以在中间根据大小关系插入合适的大于和小于符号(即 '>' 和 '<' )使其成为一个合法的不等式数列。但是现在度度熊手中只有k个小于符号即('<'')和n-k-1个大于符号(即'>'),度度熊想知道对于1至n任意的排列中有多少个排列可以使用这些符号使其为合法的不等式数列。 
输入描述:
输入包括一行,包含两个整数n和k(k < n ≤ 1000)


输出描述:
输出满足条件的排列数,答案对2017取模。

输入例子:
5 2

输出例子:
66
分析:博主能力太弱此题不会啊,应该要用动态规划
0 0