上来发现版主已经发代码了, 不过既然我说过要发代码的, 就贴在这里了,
思路和版主的一样,
先排序,版主用的是库函数, 我用的是冒泡,(库函数会不会快一点?)
再找点, 版主用的是对半,我是直接找一遍数组,(对半算法肯定要快些,)
再计算结果
思路和版主的一样,
先排序,版主用的是库函数, 我用的是冒泡,(库函数会不会快一点?)
再找点, 版主用的是对半,我是直接找一遍数组,(对半算法肯定要快些,)
再计算结果
程序代码:
#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; }