原题传送: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 }