csu 1009 抛硬币

稍微演算一下,就会发现只要把每一列大小次序依次选择元素,然后相乘相加,结果一定是最大的;

比如a > b, c > d

a c

b d

ac+bd > ad+bc (移向做差),然后扩展到多行多列的情况就行了。

有一条警告,不知道怎么排除。

29 *\csu1009.c [Warning] passing arg 4 of `qsort' from incompatible pointer type

 1 # include <stdio.h>
2 # include <stdlib.h>
3
4 # define LMAX 105
5 # define CMAX 15
6
7 double table[CMAX][LMAX];
8 double e;
9 int N, M;
10
11 int cmp(const double *pa, const double *pb);
12
13 int main()
14 {
15 double tmp;
16 int i, j;
17
18 while (1)
19 {
20 scanf("%d%d", &N, &M);
21 if (!M && !N) break;
22 for (i = 0; i < N; ++i)
23 for (j = 0; j < M; ++j)
24 scanf("%lf", &table[j][i]);
25 for (j = 0; j < M; ++j)
26 qsort(table[j], N, sizeof(double), cmp);
27 for (e = 0, i = 0; i < N; ++i)
28 {
29 tmp = 1.0;
30 for (j = 0; j < M; ++j)
31 tmp *= table[j][i];
32 e += tmp;
33 }
34 printf("%.4lf\n", e);
35 }
36
37 return 0;
38 }
39
40 int cmp(const double *pa, const double *pb)
41 {
42 if ((*pa) < (*pb)) return -1;
43 else if ((*pa) > (*pb)) return 1;
44 return 0;
45 }



你可能感兴趣的:(su)