题意:将区间分成四分,使得每个区间内的个数比较平均。
解题思路:暴力
解题代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 // File Name: h.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月04日 星期六 14时17分50秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int t ; 28 int n; 29 int num[200]; 30 int sum[200]; 31 int ans[4]; 32 int tmp[4]; 33 double mx = 1e9 ; 34 double pin; 35 void dfs(int k,double val,int step) 36 { 37 if(step == 3) 38 { 39 val += fabs(sum[160] - sum[k] - pin); 40 if(val < mx-(1e-8)) 41 { 42 memcpy(ans,tmp,sizeof(tmp)); 43 mx = val; 44 } 45 return ; 46 } 47 for(int j = k+1;j < 160 ;j ++) 48 { 49 tmp[step+1] = j; 50 dfs(j,val + fabs(sum[j]- sum[k] - pin),step + 1); 51 } 52 } 53 int main(){ 54 scanf("%d",&t); 55 for(int CA = 1; CA <= t ; CA ++) 56 { 57 scanf("%d",&n); 58 int k ; 59 int tp ; 60 mx = 1e9 ; 61 memset(num,0,sizeof(num)); 62 memset(sum,0,sizeof(sum)); 63 for(int i = 1;i <= n;i ++) 64 { 65 scanf("%d",&tp); 66 num[tp] ++ ; 67 } 68 sum[0] = num[0]; 69 for(int i = 1;i <= 160;i ++) 70 sum[i] = sum[i-1] + num[i]; 71 pin = n*1.0/4; 72 73 for(int i= 0;i < 160; i ++) 74 { 75 tmp[1] = i; 76 dfs(i,fabs(sum[i]-pin),1); 77 } 78 printf("Case %d:",CA); 79 for(int i= 1;i <= 3;i ++) 80 printf(" %d",ans[i]); 81 printf("\n"); 82 } 83 return 0; 84 }