1. 程式人生 > >bzoj 1011 遙遠的行星

bzoj 1011 遙遠的行星

zoj stream 輸出 基本 const 遠的 別人 ons pen

這不是一篇題解 我純粹是過來發泄的

這是我做過最爛的一個題 沒有之一

為什麽可以看我下面的註釋

/* 讀題讀了很久 一直沒搞懂啥是Aj
 * 終於讀懂 以為是道亂搞就能過去的水題
 * 開始亂搞 換了三種估算方法 在洛谷上都過了
 * bzoj就是wa
 * 每次換了估算方法 拿bzoj數據對比了下輸出後面 發現還是比較精確的 基本都差1%以內
 * 然後發現前面當i=20,A=0.35時 我輸出和標準輸出差很多
 * 然後看了一下發現我t=i*A t=6??
 * 以為De出bug了 然後把t=i*A換成t=(i*A + 0.01)
 * 交到bzoj又wa了……4000多ms之後
 * 最後還是翻了別人的題解 發現這裏要跟我下面一樣寫才行……交上去就A了……
 * De了兩小時bug 最後發現是這種坑之後 無語了
 * 更艹蛋的是輸出nan就能過????
 * excuse me?寫spj能再走心點麽??
*/ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int N = 1e5 + 10, F = 500; const double eps = 1e-7; double A, m[N], sum[N]; int n; int main(){ // freopen("3.in", "r", stdin); // freopen("data.out", "w", stdout); scanf("
%d%lf", &n, &A); for(int i = 1; i <= n; i++) scanf("%lf", &m[i]), sum[i] = sum[i - 1] + m[i]; for(int i = 1; i <= n; i++){ int t = i * A; if(fabs((t + 1) / A - i) < eps) t++;//De了兩小時的bug的怨念 double ans = 0; if(t <= F){
for(int j = 1; j <= t; j++) ans += (m[j] * m[i]) / (double)(i - j); printf("%lf\n", ans); continue; } int l = 1, siz = t / F, r; r = l + siz; while(r <= t){ ans += (sum[r] - sum[l - 1]) * m[i] / (double)(i - (l + r) / 2); l = r + 1; r = l + siz; } ans += (sum[t] - sum[l - 1]) * m[i] / (double)(i - (l + t) / 2); printf("%lf\n", ans); } return 0; }

bzoj 1011 遙遠的行星