题目描述头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队。每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来。在选题之前,我们对题目进行了盲审,并定出了每道题的难度系数。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a, b, c,我们希望这3道题能满足下列条件:
a<= b<= c
b - a<= 10
c - b<= 10所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求。然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?
#include <stdio.h>
#include <stdlib.h>
int comp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int n;
scanf("%d",&n);
int* problem=(int*)malloc(n*sizeof(int));
int i,add=0;
for(i=0;i<n;++i)
{
scanf("%d",&problem[i]);
}
qsort(problem,n,sizeof(int),comp);
i=0;
while(i<n)
{
if((problem[i+1]-problem[i]<=10)&&(i+1<n))
{
if((problem[i+2]-problem[i+1]<=10)&&(i+2<n))
{
i+=3;
}
else
{
i+=2;
add++;
}
}
else
{
if((problem[i+2]-problem[i+1]<=10)&&(i+2<n))
{
i+=2;
add++;
}
else
{
++i;
add+=2;
}
}
}
printf("%d",add);
}
其中的qsort函数为C语言中的快速排序函数:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针
比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
qsort(a,1000,sizeof(int),comp);
其中comp函数应写为:
1
2
3
4
|
int
comp(
const
void
*a,
const
void
*b)
{
return
*(
int
*)a-*(
int
*)b;
}
|
上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序。