bzoj 1011 遥远的行星

误差 dp (什么鬼)

读题时觉得(误差不超过 %5也算对) 这句话实在是没有什么卵用, 但是上这是解题的关键,因为两个距离很远的行星对答案的贡献非常小,

所以我们可以让一部分统一除以一个长度,为了保证精度的要求,前面的一部分要暴力算,这样就可以过了

 1 #define MAXN 100010UL
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #define eps 1e-7
 6 
 7 using namespace std;
 8 
 9 typedef long long ll;
10 
11 int n;
12 ll sum[MAXN], M[MAXN];
13 double A, f[MAXN];
14 
15 int main() {
16     scanf("%d%lf", &n, &A);
17     for(int i = 1 ; i <= n ; ++ i) scanf("%lld", &M[i]), sum[i] = M[i]+sum[i-1];
18     for(int i = 1, r = min(2000, n) ; i <= r ; ++ i) {
19         int k = (int)(i*A);
20         if(fabs((k+1)/A-i)<eps) ++ k;
21         for(int j = 1 ; j <= k ; ++ j) f[i] += M[i]*M[j]/(double)(i-j);
22     }
23     for(int i = 2001 ; i <= n ; ++ i) {
24         int k = (int)(i*A), mid = (1+k)>>1;
25         f[i] = sum[k]*M[i]/(double)(i-mid);
26     }
27     for(int i = 1 ; i <= n ; ++ i) printf("%lf\n", f[i]);
28     return 0;
29 }
View Code

 

posted @ 2016-04-29 07:41  assassain  阅读(118)  评论(0编辑  收藏  举报