您的位置:首页 > 编程语言 > C语言/C++

2016今日头条后端笔试题

2016-09-21 21:33 90 查看
/*头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队。每个出题人都出了一些有趣的题目,

而我们现在想把这些题目组合成若干场考试出来。在选题之前,我们对题目进行了盲审,并定出了每道题的难度系数。

一场考试包含3道开放性题目,假设他们的难度从小到大分别为a, b, c,我们希望这3道题能满足下列条件:

a <= b <= c

b - a <= 10

c - b <= 10

所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),

然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求。

然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?

输入

输入的第一行包含一个整数n,表示目前已经出好的题目数量。

第二行给出每道题目的难度系数 d1, d2, …, dn。

输出

输出只包括一行,即所求的答案。

样例输入

4

20 35 23 40

样例输出

2

Hint

样例解释

在样例中,一种可行的方案是添加2个难度分别为20和50的题目,这样可以组合成两场考试:(20, 20, 23)和(35, 40, 50)。

数据范围

对于30%的数据,1 <= n, di <= 5;

对于100%的数据,1 <= n <= 10^5, 1 <= di <= 100。*/

#include "iostream"

#include "vector"

using namespace std;

int find(int *a,int n)

{int i,res=0;

int A,B;

for(i=0;i<n-2;i++)

{

A=*(a+i);B=*(a+i+1);

if((B-A)>20)

{
res+=2;

}

else if((B-A)>10)

{
res+=1;

}

}

if((res+n)%3==0)return res;

else if((res+n)%3==1)return res+2;

else if((res+n)%3==2)return res+1;

}

void sort(int *a,int begin,int end)

{
if(begin>=end)return;
int dex=begin;
int de=end;
while(begin<end)
{
int temp=*(a+begin);
while(*(a+end)>=temp&&begin<end)end--;
*(a+begin)=*(a+end);
while(a[begin]<=temp&&begin<end)begin++;
*(a+end)=*(a+begin);
*(a+begin)=temp;
}
sort(a,dex,begin-1);
sort(a,begin+1,de);

}

int main()

{

int n;

while(cin>>n)

{

int *a=new int
;

  for(int i=0;i<n;i++)

  {

   cin>>*(a+i);

  }

  sort(a,0,n-1);

  cout<<find(a,n)<<endl;

  delete[] a;

}

      system("pause");

      return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  今日头条 c++