上来发现版主已经发代码了, 不过既然我说过要发代码的, 就贴在这里了,
思路和版主的一样,
先排序,版主用的是库函数, 我用的是冒泡,(库函数会不会快一点?)
再找点, 版主用的是对半,我是直接找一遍数组,(对半算法肯定要快些,)
再计算结果
程序代码:
思路和版主的一样,
先排序,版主用的是库函数, 我用的是冒泡,(库函数会不会快一点?)
再找点, 版主用的是对半,我是直接找一遍数组,(对半算法肯定要快些,)
再计算结果
程序代码:#include <stdio.h>
#define SWAP(a, b, t) t = (a), (a) = (b), (b) = (t)
int main()
{
int v[1000], k, s;
int i, j, t, p, temp;
int c, n;
scanf("%d", &t);
while(t--) {
scanf("%d%d",&n, &k);
for (i = 0; i < n; i++)
scanf("%d", &v[i]);
p = 0;
if (n >= 3) {
for (i = 0; i < n; i++) // 排序
for (j = i+1; j < n; j++)
if (v[i] > v[j])
SWAP(v[i], v[j], temp);
s = v[0] + v[1];
c = 2;
for (i = 2 ; i < n; i++, c++) // 找点
if ((s + v[i]) >= k)
break;
if (c != n) // c的值就是那c个数中任意三个数的组合都小于k
p = n*(n-1)*(n-2)/6 - c*(c-1)*(c-2)/6; // 计算, 简单的组合计算。 从n个数中取三个数的组合减去c个数中取三个数的组合。
}
printf("%d\n", p);
}
return 0;
}






