Regionals 2014 Asia

题意:将区间分成四分,使得每个区间内的个数比较平均。

解题思路:暴力

解题代码:

 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("
");
82     }
83 return 0;
84 }
View Code
原文地址:https://www.cnblogs.com/zyue/p/4394747.html