ZOJ2688 Requirements

  原题传送:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2688

  这题在武森的论文《浅谈信息学竞赛中的“0”和“1”》中有很精彩的讲解。

  这道题暴力枚举肯定TLE,转而想到消去绝对值符号,式子前面加上“+”和“-”两个符号,有5维,则一共有25种情况,而总的最大值是这25种情况的最大值减最小值。对于每种情况,都可以O(n)求出最大值和最小值。总复杂度为O(n*2k ),可以承受了。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 100005
 4 
 5 double a[N][32], data[5];
 6 
 7 void dfs(int i, double v, int d, int k)
 8 {
 9     if(d == 5)
10     {
11         a[i][k] = v;
12         return ;
13     }
14     dfs(i, v + data[d], d + 1, k * 2 + 1);
15     dfs(i, v - data[d], d + 1, k * 2);
16 }
17 
18 int main()
19 {
20     freopen("data.in", "r", stdin);
21     int n, i, j;
22     double max, min, ans;
23     while(scanf("%d", &n), n)
24     {
25         for(i = 0; i < n; i ++)
26         {
27             for(j = 0; j < 5; j ++)
28             {
29                 scanf("%lf", &data[j]);
30             }
31             dfs(i, 0.0, 0, 0);
32         }
33         ans = 0.0;
34         for(j = 0; j < 32; j ++)
35         {
36             max = a[0][j], min = a[0][j];
37             for(i = 1; i < n; i ++)
38             {
39                 if(a[i][j] > max)
40                     max = a[i][j];
41                 if(a[i][j] < min)
42                     min = a[i][j];
43             }
44             if(max - min > ans)
45                 ans = max - min;
46         }
47         printf("%.2f\n", ans);
48     }
49     return 0;
50 }
原文地址:https://www.cnblogs.com/huangfeihome/p/2729113.html