百度2017秋招笔试真题
1. 买帽子
【分析】STL set,去重后取第三小的值即可。注意输出-1的情形:set中的元素个数<3。
#include <iostream>
#include <set>
using namespace std;
int N;
int a[55];
set<int> hat;
set<int>::iterator it;
int main()
{
int i;
cin>>N;
for(i=0;i<N;i++)
{
cin>>a[i];
hat.insert(a[i]);
}
if(hat.size()<3)
cout<<"-1"<<endl;
else
{
it=hat.begin();
it++,it++;
cout<<*it<<endl;
}
return 0;
}
2. 度度熊回家
【分析】暴力求解法。枚举所有的点,然后维护答案即可。
#include <stdio.h>
#include <math.h>
#include <string.h>
#define maxn 105
#define INF 99999999
int N,x;
int a[maxn];
int is_point[2*maxn];
int main()
{
int i,j;
int cur,sum,mindist;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
is_point[a[i]+100]=1;
}
mindist=INF;
for(i=1;i<N-1;i++)
{
is_point[a[i]+100]=0;
sum=0;
cur=a[0];
for(j=1;j<N;j++)
{
if(is_point[a[j]+100])
{
sum+=(fabs(cur-a[j]));
cur=a[j];
}
}
is_point[a[i]+100]=1;
if(sum<mindist)
mindist=sum;
}
printf("%d\n",mindist);
return 0;
}
3. 寻找三角形
【分析】暴力枚举+统计。注意求三角形面积时可使用叉积或海伦公式。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=105;
int N;
struct Triangle
{
char color;
int x;
int y;
int z;
} t[maxn];
int main()
{
int i,j,k;
double a,b,c,p,S;
double maxarea=0;
cin>>N;
for(i=0;i<N;i++)
cin>>t[i].color>>t[i].x>>t[i].y>>t[i].z;
for(i=0;i<N;i++)
{
for(j=i+1;j<N;j++)
{
for(k=j+1;k<N;k++)
{
if((t[i].color==t[j].color && t[j].color==t[k].color) ||
(t[i].color!=t[j].color && t[j].color!=t[k].color && t[i].color!=t[k].color))
{
a=sqrt(pow((t[i].x-t[j].x),2)+pow((t[i].y-t[j].y),2)+pow((t[i].z-t[j].z),2));
b=sqrt(pow((t[i].x-t[k].x),2)+pow((t[i].y-t[k].y),2)+pow((t[i].z-t[k].z),2));
c=sqrt(pow((t[j].x-t[k].x),2)+pow((t[j].y-t[k].y),2)+pow((t[j].z-t[k].z),2));
p=(a+b+c)/2;
S=sqrt(p*(p-a)*(p-b)*(p-c));
maxarea=max(S,maxarea);
}
}
}
}
printf("%.5lf\n",maxarea);
return 0;
}