HDU 4355

View Code
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cmath>

 4 #include<algorithm>

 5 #define EPS 1e-4

 6 #define MAXN 50004

 7 using namespace std;

 8 double x[MAXN],w[MAXN];

 9 

10 inline double get_f1(double xx, int start, int n)

11 {

12      double sum(0);

13      for (int i(start); i<n; ++i) {

14           sum += (xx - x[i])*(xx - x[i])*w[i];   

15      }       

16      return sum;

17 }

18 

19 inline double get_res(double xx, int n)

20 {

21      double sum(0);

22      for (int i(0); i<n; ++i) {

23           sum += fabs((xx - x[i])*(xx - x[i])*(xx - x[i]))*w[i];

24      }

25      return sum;       

26 }

27 

28 inline int cmp(double x)

29 {

30     if (x > EPS)return 1;

31     if (x < -EPS)return -1;

32     return 0;    

33 } 

34 

35 int main()

36 {

37     int n;

38     int t;

39     scanf("%d",&t);

40     for (int cnt(1); cnt<=t; ++cnt) {

41         cout<<"Case #"<<cnt<<": ";

42         int n;

43         scanf("%d",&n);

44         for (int i(0); i<n; ++i) {

45             scanf("%lf%lf",&x[i],&w[i]);    

46         }    

47         

48         double l(x[0]),r(x[n-1]),mid(0);

49         while (true) {

50             mid = (l + r)/2.0;

51             int midx = upper_bound(x,x+n,mid) - x;

52             double fir(get_f1(mid,0,midx)),sec(get_f1(mid,midx,n));

53             if (cmp(fir - sec) > 0)r = mid;

54             else if (cmp(fir - sec) < 0)l = mid;

55             else break;      

56         }

57         __int64 ans = get_res(mid,n) + 0.5;

58         printf("%I64d\n",ans);

59     }

60     return 0;    

61 }

你可能感兴趣的:(HDU)