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 }